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

http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2142&cid=1186

题目描述

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

主要难点是用邻接表去存,相比于邻接矩阵这个要稍麻烦一点,原则上有两种做法,先介绍用queue和vector的那种做法。

 1 #include<cstdio>

 2 #include<cstring>

 3 #include<iostream>

 4 #include<queue>

 5 #include<vector>

 6 using namespace std;

 7 priority_queue<int ,vector<int >,greater<int> >sort[151];

 8 //sort数组是凡是与sort的下标相连的点组成的队列,且为优先队列

 9 queue<int>q;//建立q普通队列

10 int u,v;

11 int mark;//控制输出

12 int vis[151];//标记数组

13 void BFS(int kk)

14 {

15     q.push(kk);// 是首元素,直接加入队列

16     vis[kk]=1;

17     while(!q.empty())//判断是否为空

18     {

19         int s=q.front();//取队列首元素

20         q.pop();//删除队列头元素,就是下面直接输出

21         if(mark)//控制输出空格

22         {

23             cout<<s;

24             mark=0;

25         }

26         else

27             printf(" %d",s);

28         while(!sort[s].empty())//判断这个相关联队列是否为空

29         {

30             int ss=sort[s].top();//取它的队列首元素

31             if(!vis[ss])//如果没被标记

32             {

33                 q.push(ss);//就加入q队列中

34                 vis[ss]=1;

35             }

36             sort[s].pop();//直接删除掉这个队列首元素

37         }

38     }

39 }

40 

41 int main()

42 {

43     //memset(map,0,sizeof(map));

44 

45 

46     while(!q.empty())//将队列清空

47         q.pop();

48     int n;

49     cin>>n;

50     for(int i=1; i<=n; i++)

51     {

52         memset(vis,0,sizeof(vis));

53         int k,m,t;

54         cin>>k>>m>>t;

55         for(int k=1; k<=m; k++)//将队列清空

56         {

57             while(!sort[k].empty())

58             {

59                 sort[k].pop();

60             }

61         }

62         for(int j=1; j<=m; j++)

63         {

64             cin>>u>>v;

65             sort[u].push(v);//因为是用邻接表在存储,所以用这种形式表示与u有关联的点存在sort这个队列中

66             sort[v].push(u);

67         }

68 

69         mark=1;

70         BFS(t);

71         printf("\n");

72     }

73     return 0;

74 }
View Code

 

你可能感兴趣的:(数据结构)