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

题目描述

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

 


posted @ 2013-08-13 10:58  WangLC  阅读(361)  评论(0编辑  收藏  举报