题目:
输出无向图的给定起点的先广序列。
输入格式:
输入第一行给出三个正整数,分别表示无向图的节点数N(1<N≤10)、边数M(≤50)和探索起始节点编号S(节点从1到N编号)。
随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号。
输出格式:
输出从S开始的无向图的先广搜索序列,用一个空格隔开,最后也有一个空格;如果为非连通图,再在结尾处另起一行输出一个0,表示此图非连通。
由于广度优先遍历的节点序列是不唯一的,为了使得输出具有唯一的结果,我们约定以表头插入法构造邻接表。
输入样例:
6 8 2
1 2
2 3
3 4
4 5
5 6
6 4
3 6
1 5
输出样例:
2 3 1 6 4 5
代码:
#include <bits/stdc++.h>
using namespace std;
int N;
int M;
int S;
deque<int> grp[20];
bool vis[20] ;
vector<int> ans;
void bfs(int s)
{
queue<int> que;
que.push(s);
while(que.empty()==0){
int po = que.front();
que.pop();
if(vis[po]==false){
vis[po]=true;
ans.push_back(po);
for(int i=0;i<grp[po].size();i++){
que.push(grp[po][i]);
}
}
}
}
int main()
{
cin>>N>>M>>S;
int n1,n2;
for(int i=0;i<M;i++){
cin>>n1>>n2;
grp[n1].push_front(n2);
grp[n2].push_front(n1);
}
bfs(S);
for(int i=0;i<ans.size();i++){
cout<<ans[i]<<" ";
}
if(ans.size()!=N){
cout<<"\n0";
}
}