数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历


数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历

Time Limit: 1000MS Memory limit: 65536K

题目描述

给定一个无向连通图,顶点编号从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:
 1 #include<stdio.h>//用bfs遍历无向图邻接矩阵
 2 #include<string.h>
 3 int map[101][101];
 4 int vis[101],que[101];//建立标记数组和队列
 5 int m,k,t,flag;
 6 void bfs(int t)
 7 {
 8     int l=0,r=0;
 9     int i,j;
10     //r变量只跟随着队列走
11     que[r]=t;
12     r++;//r在这里是1
13     for(i=0;i<k;i++)//循环r次,r的值会随着循环体中的语句而变化,这里应该可以把r改成k,因为最终r会等于k
14     {
15         l++;//l的作用是保存住头下标,实际上已经变成了头下标+1,同时也代表着已经输出的元素个数
16         for(j=0;j<k;j++)//k是节点数
17         {
18             if(!vis[j]&&map[que[l-1]][j])//que[l-1]在这里指的是上一次头下标
19             {
20                 que[r]=j;//让和l-1邻接的元素下表全部入队列
21                 r++;//r控制着整体的大循环
22                 vis[j]=1;//vis[j]==1代表与l-1邻接的元素已经访问完
23             }
24         }
25     }
26 }
27 int main()
28 {
29     int h,n,i,u,v;
30     scanf("%d",&n);
31     for(h=1;h<=n;h++)
32     {
33         memset(vis,0,sizeof(vis));
34         memset(map,0,sizeof(map));
35         scanf("%d%d%d",&k,&m,&t);//t是遍历的起点
36         for(i=0;i<m;i++)//建立无向图邻接矩阵
37         {
38             scanf("%d%d",&u,&v);
39             map[u][v]=1;
40             map[v][u]=1;
41         }
42         flag=1;
43         vis[t]=1;//让标记数组中的t下标数组元素等于1
44         bfs(t);//从t开始遍历,并保存进队列que
45         //输出队列中的元素
46         for(i=0;i<k;i++)
47         if(i==0)printf("%d",que[i]);
48         else printf(" %d",que[i]);
49         printf("\n");
50     }
51     return 0;
52 }
View Code

 代码2:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<queue>
 6 using namespace std;
 7 int m,n,k;
 8 int map[101][101],visited[1001];
 9 int sttr(const void *a,const void *b)
10 {
11     return *(int *)a-*(int *)b;
12 }
13 void fbs()
14 {
15     cout<<k;
16     visited[k]=1;
17     queue<int>que;
18     que.push(k);
19     while(!que.empty())
20     {
21         int f[1000];
22         int t=0;
23         k=que.front();
24         que.pop();
25         int i;
26         for(i=0; i<=m-1; i++)
27             if(map[k][i]==1&&visited[i]==0)
28             {
29                 visited[i]=1;
30                 f[t++]=i;
31             }
32         qsort(f,t,sizeof(f[0]),sttr);
33         for(i=0; i<=t-1; i++)
34         {
35             que.push(f[i]);
36             cout<<" "<<f[i];
37         }
38     }
39     cout<<endl;
40 }
41 int main()
42 {
43     int zong;
44     cin>>zong;
45     while(zong--)
46     {
47         cin>>m>>n>>k;
48         memset(map,0,sizeof(map));
49         memset(visited,0,sizeof(visited));
50         int i;
51         for(i=1;i<=n;i++)
52         {
53             int u,v;
54             cin>>u>>v;
55             map[u][v]=1;
56             map[v][u]=1;
57         }
58         fbs();
59     }
60     return 0;
61 }
View Code

 



posted @ 2013-08-06 19:23  狂盗一枝梅  阅读(522)  评论(0编辑  收藏  举报