01:图的深度优先遍历与广度优先遍历

01:图的深度优先遍历与广度优先遍历

【题目】

描述

给出一个无向图顶点和边的信息,输出这个无向图的深度优先遍历序列和广度优先遍历序列。从一个顶点出发如果有2个以上的顶点可以访问时,我们约定先访问编号大的那个顶点。示例输入对应的图如下图所示:
在这里插入图片描述

输入

输入的第1行有2个整数m和n。表示图g有m个顶点和n条边。
第2行是m个以空格隔开的字符串,依次是图中第1个顶点的名字,第2个顶点的名字…第m个顶点的名字。
此后还有n行,每行由2个字符串构成,分别是构成图中1条边的两个顶点。我们约定不会有重边。

输出

输出有2行。
第1行是从第1个顶点出发对图g做深度优先遍历得到的顶点序列。
第2行是从第1个顶点出发对图g做广度优先遍历得到的顶点序列。

样例输入

8 9
v1 v2 v3 v4 v5 v6 v7 v8
v1 v2
v1 v3
v1 v6
v2 v3
v2 v4
v3 v4
v4 v6
v5 v6
v7 v8

样例输出

v1 v6 v5 v4 v3 v2 v7 v8
v1 v6 v3 v2 v5 v4 v7 v8

提示

注意:从一个顶点出发如果有2个以上的顶点可以访问时,我们约定先访问编号大的那个顶点。

来源

重庆科技学院 WJQ

【思路】

宽搜和深搜,还挺简单

【代码】

#include<bits/stdc++.h>
using namespace std;
int n,m,k,op,idx=0,kpl;
int path[10010];
vector<int>pr[10010];
char a[10010];
bool vi[10010],v[10010];
bool cmpy(int xx,int yy){
	return xx>yy;
}
void dfs(int ap){
	path[++idx]=ap;
	if(pr[ap][0]==0)return;
	for(int i=0;i<pr[ap].size();i++){
		if(vi[pr[ap][i]]==0){vi[pr[ap][i]]=1;dfs(pr[ap][i]);
		}
	}
}
void bfs(int adc){
	if(pr[adc][0]==0)return;
	for(int i=0;i<pr[adc].size();i++){
		if(v[pr[adc][i]]==0){
			v[pr[adc][i]]=1;
			path[++idx]=pr[adc][i];
		}
	}
	for(int i=0;i<pr[adc].size();i++)if(vi[pr[adc][i]]==0){
		vi[pr[adc][i]]=1;bfs(pr[adc][i]);
	}
}
int main(){
	cin>>n>>m;
	char t;
	for(int i=1;i<=n;i++)cin>>t>>a[i];
	for(int i=1;i<=m;i++){
		int x,y;
		cin>>t>>x>>t>>y;
		pr[x].push_back(y);
		pr[y].push_back(x);
	}
	for(int i=1;i<=n;i++)sort(pr[i].begin(),pr[i].end(),cmpy);
	for(int i=1;i<=n;i++)
		if(vi[i]==0){
			vi[i]=1;dfs(i);
	}
	for(int i=1;i<=idx;i++)cout<<"v"<<path[i]<<" ";
	cout<<endl;
	memset(vi,0,sizeof(vi));
	memset(vi,0,sizeof(vi));
	idx=0;
	for(int i=1;i<=n;i++)
	if(vi[i]==0){
		path[++idx]=i;
		vi[i]=1;
		v[i]=1;
		bfs(i);
	}
	for(int i=1;i<=n;i++)cout<<"v"<<path[i]<<" ";
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/Double020/article/details/87862776