题目描述
给定一个无向连通图,顶点编号从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
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<queue> 5 #include<cstdlib> 6 7 using namespace std; 8 int map[105][105]; 9 int visited[105]; 10 int mark=1; 11 int i,root,bian; 12 13 queue<int> q; 14 15 void bfs(int h,int bian) 16 { 17 memset(visited,0,sizeof(visited)); 18 q.push(h); 19 visited[h]=1; 20 while(!q.empty()) 21 { 22 int t=q.front(); 23 q.pop(); 24 if(mark) 25 { 26 printf("%d",t); 27 mark=0; 28 } 29 30 else printf(" %d",t); 31 for(i=0; i<bian; i++) 32 { 33 if(!visited[i]&&map[t][i]) 34 { 35 q.push(i); 36 visited[i]=1; 37 } 38 } 39 } 40 } 41 42 int main() 43 { 44 45 int root,bian,h; 46 int n,i,j,x,y; 47 scanf("%d",&n); 48 for(i=0; i<n; i++) 49 { 50 memset(map,0,sizeof(map)); 51 scanf("%d%d%d",&root,&bian,&h); 52 for(j=0; j<bian; j++) 53 { 54 scanf("%d%d",&x,&y); 55 map[x][y]=map[y][x]=1; 56 } 57 bfs(h,bian); 58 printf(" "); 59 } 60 return 0; 61 }