数据结构实验之图论二:基于邻接表的广度优先搜索遍历

题目描述

给定一个无向连通图,顶点编号从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

 

posted on 2013-06-29 19:14  straw_berry  阅读(513)  评论(0编辑  收藏  举报