主要思想:首先以一个未被访问过的顶点作为起始顶点,访问其所有相邻的顶点,然后对每个相邻的顶点,再访问他们相邻的未被访问过的顶点,直到所有的顶点都被访问过,遍历结束。
#include<stdio.h>
int main()
{
int i,j,n,m,a,b,cur,book[101]={0},e[101][101];
int que[10001],head,tail;
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(i==j)
e[i][j] = 0;
else
e[i][j] = 99999999;
}
}
for(i=1;i<=m;i++){
scanf("%d %d",&a,&b);
e[a][b] = 1;
e[b][a] = 1;
}
head = 1;
tail = 1;
que[tail] = 1;
tail++;
book[1] = 1;
while(head<tail&&tail<=n){
cur = que[head];//当前正在访问顶点编号
for(i=1;i<=n;i++){
if(e[cur][i]==1&&book[i]==0){
que[tail] = i;//将有边的顶点i入队
tail++;
book[i] = 1;
}
if(tail>n)//表明所有的顶点都访问过
break;
}
head++;
}
for(i=1;i<tail;i++){
printf("%d ",que[i]);
}
getchar();getchar();
return 0;
}
输入:
5 5
1 2
1 3
1 5
2 4
3 5
输出:
1 2 3 5 4