数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
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顶点的无向边。
对于每组数据,第一行是三个整数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(" "); 50 } 51 return 0; 52 }
代码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 }