#include<bits/stdc++.h>
using namespace std;
const int N=110;
vector<int> a[N];
queue<int> q;
int arr[N],idx;
int n,m,k,x,u,v;
int flag[N];
void init(int n)//初始化
{
idx=0;
memset(flag,0,sizeof flag);
for(int i=0;i<n;i++)
{
if(a[i].size())
{
a[i].clear();//清空邻接表
}
}
}
void buildlist()//建立邻接表
{
for(int i=0;i<m;i++)
{
cin>>u>>v;
a[u].push_back(v);//无向图所以要建两个方向
a[v].push_back(u);
}
}
void bfs()
{
q.push(k);//将第一个要遍历的结点加入队列
arr[idx++]=k;
flag[k]=true;//更新当前结点状态为已被遍历
while(q.size())//当队列不为空
{
for(auto t:a[q.front()])//遍历当前队列头的值的邻接表
{
if(!flag[t])//如果当前结点还没有被遍历过
{
q.push(t);//将该节点压入队列
arr[idx++]=t;
flag[t]=true;//更新当前结点状态
}
}
q.pop();//将当前结点从队列中弹出
}
}
int main()
{
cin>>x;
while(x--)
{
cin>>n>>m>>k;
init(n);
buildlist();
bfs();
for(int i=0;i<idx-1;i++)
cout<<arr[i]<<" ";
cout<<arr[idx-1]<<endl;
}
return 0;
}
E - 数据结构实验之图论二:基于邻接表的广度优先搜索遍历
于 2023-01-15 00:12:15 首次发布