数据结构实验之图论一:基于邻接矩阵的广度优先搜索遍历
Time Limit: 1000MS
Memory Limit: 65536KB
Problem Description
给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列。(同一个结点的同层邻接点,节点编号小的优先遍历)
Input
输入第一行为整数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顶点的无向边。
Output
输出有n行,对应n组输出,每行为用空格隔开的k个整数,对应一组数据,表示BFS的遍历结果。
Example Input
1 6 7 0 0 3 0 4 1 4 1 5 2 3 2 4 3 5
Example Output
0 3 4 2 5 1
已知是无向边,所以我们要用邻接矩阵来存放边和点,比如矩阵Bfs【0】【3】=1并且Bfs【3】【0】=1就说明0和3是相连的无向边,我们为了防止出现两个点都遍历到就设置一个visit数组来判断它是不是被遍历过了,至于遍历过程我们可以用栈来做。
关于这个visit数组,为什么我们把他设置成一维的。由题意知,0是开始遍历的点,即visit【0】=true,到Bfs【0】【3】的时候visit【3】=true,这就确保到下次从3开始遍历的时候visit【0】和visit【3】都是等于true,。
#include<bits/stdc++.h> using namespace std; int in,out;///模拟队列 int Bfs[110][110];///用邻接矩阵来存储一个图 bool visit[110];///来判断该点是否被访问过 void bfs(int n,int k,int m) { in=out=0; int q[110];///模拟栈 q[in++]=n;初始节点入栈 while(in>out)///队列不空 { int x=q[out];///出栈判断是不是邻接点 out++; for(int i=0;i<k;i++)///循环找邻接点 { if(!visit[i]&&Bfs[x][i]==1) { visit[i]=true; q[in++]=i; cout<<" "<<i; } } } } int main() { int t; int k,m,n; cin>>t; while(t--) { memset(Bfs,0,sizeof(Bfs)); memset(visit,false,sizeof(visit)); cin>>k>>m>>n;///k个顶点,m条边,初始顶点 for(int i=0;i<m;i++) { int u,v; cin>>u>>v; Bfs[u][v]=Bfs[v][u]=1; } cout<<n; visit[n]=true; bfs(n,k,m); cout<<endl; } return 0; }