大致思路:从一个顶点cur出发,输出cur,遍历找到与cur有关系的边,进入该顶点,循环往复。
代码:
#include<iostream>
using namespace std;
int main(){
int e[101][101]={0};
bool book[101]={0};
int que[10001]={0};
int head=1,tail=1;
int n,m;
int cur=1;
cin>>n>>m;
//初始化二维矩阵
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j){
e[i][j]=0;
}else{
e[i][j]=99999999;
}
}
}
//读入顶点之间的边
for(int i=1;i<=m;i++){
int a,b;
cin>>a>>b;
e[a][b]=1;
e[b][a]=1;
}
//初始化队列
//从1号顶点出发,将1号顶点加入队列
que[head]=cur;
tail++;
book[cur]=1;//标记1号顶点已访问
//当队列不为空的时候循环
while(head<tail){
cur=que[head];//当前正在访问的顶点编号
for(int i=1;i<=n;i++){//从1~n依次尝试
//判断从顶点cur到顶点i有边,且顶点i没有被访问过,则将顶点i入队
if(e[cur][i]==1&&book[i]==0){
book[i]=1;//标记顶点i已访问
que[tail]=i;
tail++;
}
//如果tail大于n,则表明所有顶点都已经被访问过
if(tail>n){
break;
}
}
head++;//注意这里千万不要忘记,只有当一个点扩展结束后,head++,然后才能继续向下扩展
}
for(int i=1;i<tail;i++){
cout<<que[i]<<" ";
}
return 0;
}