#include <bits/stdc++.h>
using namespace std;
int mp[100][100]; //图矩阵表示
int flag[100]; //标记该点是否已经遍历
int b[100]; // 输出顺序
int flag1=1,k;
void BFS(int t)
{ int ls[100]; //邻接边的另一顶点
int i,n=1; //n来标记改点邻接边的数目
flag[t]=1;
for(i=0; i<k; i++)
{
if(mp[t][i]==1&&flag[i]==0)//从小到大记录有连接的点
{
b[flag1++]=i; // 输出顺序
ls[n++]=i; //下一个遍历顺序
flag[i]=1; //标记该无向边已被遍历防止再次遍历
}
}
for(i=1;i<n;i++)
{
BFS(ls[i]); //递归遍历
}
}
int main()
{
int n,u,v,m,t,i;
scanf("%d",&n);
while(n--)
{
flag1 =1;
memset(mp,0,sizeof(mp)); //将mp[][]用0填满
memset(flag,0,sizeof(flag)); //讲flag[]用0填满
scanf("%d%d%d",&k,&m,&t);//输入k边m点初始遍历t
for(i=0;i<m;i++)
{
cin >> u >> v;
mp[u][v]=mp[v][u]=1; //录入无向线端点为vu
}
cout << t;//直接输入第一个遍历的点
BFS(t);//递归
for(i=1;i<flag1;i++)//flag1是一共有多少个需要输出的点
{
cout << ' ' << b[i];//按顺序输出
}
cout << endl;
}
return 0;
}
数据结构实验之图论一:基于邻接矩阵的广度优先搜索遍历
最新推荐文章于 2020-12-03 20:42:11 发布