这道题的算法思想主要是利用邻接矩阵来存储图的顶点和边的关系,然后利用递归的思想,访问完与当前顶点相关的顶点后,再退回上一步,继续操作与上一顶点相关的顶点和边。
代码如下:
#include <bits/stdc++.h>
using namespace std;
int v[110];
int arc[110][110];
void BFS(int k,int t){/*广度优先遍历函数*/
int flag=0;
queue<int> q;//建立一个辅助队列;
q.push(t);//将开始遍历的顶点入队;
while(!q.empty()){//当前队列不为空;
int p=q.front();
q.pop();
for(int i=0;i<k;i++){
if(arc[p][i]&&!v[p]){
q.push(i);//将与当前顶点相邻且未被访问过的顶点入队
arc[p][i]=arc[i][p]=0;
}
}
if(!v[p]){
if(!flag){
cout<<p;
flag=1;
}
else{
cout<<" "<<p;
v[p]=1;//标记已经访问过的顶点;
}
}
}
}
int main(){
int n,k,m,t,u,s;
cin>>n;
while(n--){
memset(v,0,sizeof(v));//将数组置0;
memset(arc,0,sizeof(arc));
cin>>k>>m>>t;
for(int i=0;i<m;i++){/*构建邻接矩阵*/
cin>>u>>s;
arc[u][s]=arc[s][u]=1;
}
BFS(k,t);
}
return 0;
}