题目描述
给定一个无向连通图,顶点编号从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<cstring> 3 #include<iostream> 4 #include<cstdlib> 5 #include<queue> 6 7 using namespace std; 8 int visited[101]; 9 int n,m,k; 10 queue<int>q; 11 struct node 12 { 13 int x,y; 14 struct node *next; 15 }*head[101]; 16 17 void add(int x,int y) 18 { 19 struct node *p=(struct node *)malloc(sizeof(struct node)); 20 p->x=x; 21 p->y=y; 22 p->next=head[x]; 23 head[x]=p; 24 } 25 26 int cmp(const void *a,const void *b) 27 { 28 return *(int *)a-*(int *)b; 29 } 30 void bfs(int t) 31 { 32 int i,x,a[101],b[101],j,y; 33 q.push(t); 34 visited[t]=1; 35 j=0; 36 while(!q.empty()) 37 { 38 x=q.front(); 39 a[++j]=x; 40 q.pop(); 41 y=0; 42 for(struct node *p=head[x]; p!=NULL; p=p->next) 43 { 44 if(visited[p->y]==0) 45 { 46 b[y++]=p->y; 47 visited[p->y]=1; 48 } 49 50 } 51 if(y>=1) 52 qsort (b,y,sizeof(b[0]),cmp); 53 for(i=0; i<y; i++) 54 q.push(b[i]); 55 56 } 57 for(i=1; i<=j-1; i++) 58 printf("%d ",a[i]); 59 printf("%d ",a[i]); 60 } 61 int main() 62 { 63 int t,i,x,y; 64 scanf("%d",&n); 65 while(n--) 66 { 67 memset(head,NULL,sizeof(head)); 68 memset(visited,0,sizeof(visited)); 69 cin>>k>>m>>t; 70 for(i=0;i<m;i++) 71 { 72 cin>>x>>y; 73 add(x,y); 74 add(y,x); 75 } 76 bfs(t); 77 }return 0; 78 }