8
作者:
xxdmd8
,
2024-12-19 00:33:12
,
所有人可见
,
阅读 4
图的建立和应用
【问题描述】输入无向图的顶点和弧的数据,建立该图的邻接矩阵或邻接表,分别实现该图的深度、广度优先遍历,并输出结果。
【输入形式】输入无向图的顶点和弧信息。
【输出形式】图的深度和广度遍历结果。
【样例输入】
4 5(节点个数和边的个数)
1 2 3 4(节点信息)
1 2(边信息)
1 3
1 4
2 3
3 4
【样例输出】
1 2 3 4
1 2 3 4
说明:1、每种遍历结果输出占一行,输出信息分别为节点信息,每个信息之间用单个空格隔开,先输出深度优先遍历结果,再输出广度优先遍历结果。
【备注】由于图建立的邻接表不一样,输出结果不唯一,所以只需要提交正确程序即可。
#include<iostream>
#include <vector>
#include<cstring>
#include <queue>
using namespace std;
const int N = 100010;
int n ,m;
int h[N],e[N],ne[N],idx;
bool st[N];
int q[N];
vector<int> dfs_result,bfs_result;
void add(int a,int b){
e[idx] = b,ne[idx] = h[a],h[a] = idx ++;
}
void dfs(int u){
st[u] = true;
dfs_result.push_back(u);
for(int i = h[u];i != -1;i = ne[i]){
int j = e[i];
if(!st[j]){
dfs(j);
}
}
}
void bfs(int s){
int hh = 0,tt = -1;
memset(st,false,sizeof st);
q[++tt] = s;
st[s] = true;
while(hh <= tt){
int t = q[hh++];
bfs_result.push_back(t);
for(int i = h[t];i != -1;i = ne[i]){
int j = e[i];
if(!st[j]){
q[++tt] = j;
st[j] = true;
}
}
}
}
int main(){
memset(h, -1, sizeof h);
cin >> n >> m;
for(int i = 0;i < m; i ++){
int temp;
cin >> temp;
}
for(int i = 0;i < m; i ++){
int a, b;
cin >> a >> b;
add(a, b),add(b, a);
}
dfs(1);
for(int i = 0;i < dfs_result.size();i ++){
cout << dfs_result[i] << " ";
}
cout << endl;
bfs(1);
for(int i = 0;i < bfs_result.size();i ++){
cout << bfs_result[i] << " ";
}
cout << endl;
return 0;
}