题目描述
给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列。(同一个结点的同层邻接点,节点编号小的优先遍历)
输入
输入第一行为整数n(0< n <100),表示数据的组数。
对于每组数据,第一行是三个整数k,m,t(0<k<100,0<m<(k-1)*k/2,0< t<k),表示有m条边,k个顶点,t为遍历的起始顶点。
下面的m行,每行是空格隔开的两个整数u,v,表示一条连接u,v顶点的无向边。
输出
输出有n行,对应n组输出,每行为用空格隔开的k个整数,对应一组数据,表示BFS的遍历结果。
示例输入
1
6 7 0
0 3
0 4
1 4
1 5
2 3
2 4
3 5
示例输出
0 3 4 2 5 1
1 #include<queue>
2 #include<vector>
3 #include<stdio.h>
4 #include<
string.h>
5 using namespace std;
6 priority_queue<
int, vector<
int>, greater<
int> >head[
100];
7 queue<
int>
q;
8 bool vis[
110];
9 int flag;
10 void bfs()
11 {
12 while(!
q.empty())
13 {
14 int cur =
q.front();
15 q.pop();
16 if(flag ==
0)
17 {
18 printf(
"%d",cur);
19 flag =
1;
20 }
21 else printf(
" %d",cur);
22 while(!
head[cur].empty())
23 {
24 int tmp =
head[cur].top();
25 if(!
vis[tmp])
26 {
27 q.push(tmp);
28 vis[tmp] =
1;
29 }
30 head[cur].pop();
31 }
32 }
33 printf(
"\n");
34 }
35
36 int main()
37 {
38 int t, n, m, k, u, v;
39 scanf(
"%d", &
t);
40 while(t--
)
41 {
42 scanf(
"%d %d %d", &n, &m, &
k);
43 memset(vis,
0,
sizeof(vis));
44 for(
int i =
0; i < n; i++
)
45 while(!
head[i].empty())
46 head[i].pop();
47 while(m--
)
48 {
49 scanf(
"%d %d", &u, &
v);
50 head[u].push(v);
51 head[v].push(u);
52 }
53 while(!
q.empty())q.pop();
54 q.push(k);
55 vis[k] =
1;
56 flag =
0;
57 bfs();
58 }
59 return 0;
60 }
View Code
转载于:https://www.cnblogs.com/LK1994/p/3162662.html
相关资源:JAVA上百实例源码以及开源项目