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顶点的无向边。
对于每组数据,第一行是三个整数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 }