这道题的算法思想主要是利用邻接矩阵来存储图的顶点和边的关系,然后利用递归的思想,访问完与当前顶点相关的顶点后,再退回上一步,继续操作与上一顶点相关的顶点和边。
代码如下:
#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; }
