图的深度优先遍历与广度优先遍历
程序员文章站
2022-03-03 11:36:18
...
**
图的深度优先遍历与广度优先遍历
**
题目:
给出一个无向图顶点和边的信息,输出这个无向图的深度优先遍历序列和广度优先遍历序列。从一个顶点出发如果有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
代码:
#include<bits/stdc++.h>
using namespace std;
int mapp[1000][1000],a[1000],book[1000],path[1000];
int m,n,idx;
void dfs(int x){
if(book[x]){
return;
}
book[x]=1;
path[++idx]=x;
for(int i=m;i>=1;i--){
if(mapp[x][i])dfs(i);
}
}
void bfs(int x){
if(book[x])return;
queue<int> q;
q.push(a[x]);
path[++idx]=x;
book[x]=1;
while(!q.empty()){
for(int i=m;i>=1;i--){
if(!book[i]&&mapp[q.front()][i]){
path[++idx]=i;
book[i]=1;
q.push(i);
}
}
q.pop();
}
}
int main(){
cin>>m>>n;
char gg;
for(int i=1;i<=m;i++){
cin>>gg>>a[i];
}
for(int i=1;i<=n;i++){
int x,y;
cin>>gg>>x>>gg>>y;
mapp[x][y]=mapp[y][x]=1;
}
for(int i=1;i<=m;i++){
dfs(i);
}
for(int i=1;i<=idx;i++){
cout<<"v"<<path[i]<<" ";
}
idx=0;
memset(path,0,sizeof(path));
memset(book,0,sizeof(book));
cout<<endl;
for(int i=1;i<=m;i++){
bfs(i);
}
for(int i=1;i<=idx;i++){
cout<<"v"<<path[i]<<" ";
}
return 0;
}
上一篇: 图的遍历dfs
下一篇: 树的深度优先遍历与广度优先遍历