Problem Description
已知用邻接矩阵A形式表示的无向图G,满足:
如果图G中存在边(vi,vj),则A[i][j]=1,否则A[i][j]=0。
顶点编号从1到n,从1号顶点开始以深度优先遍历方式输出图G中的每个顶点(有多个邻接点时按照序号从小到大顺序访问),对于非连通图按照顶点编号顺序选择下一个未遍历顶点继深度优先遍历。
如果图G中存在边(vi,vj),则A[i][j]=1,否则A[i][j]=0。
顶点编号从1到n,从1号顶点开始以深度优先遍历方式输出图G中的每个顶点(有多个邻接点时按照序号从小到大顺序访问),对于非连通图按照顶点编号顺序选择下一个未遍历顶点继深度优先遍历。
Input
按行排列的邻接矩阵A,矩阵每行元素占用一行,元素间用一个空格间隔,相邻矩阵间用一个空行间隔,处理到文件结束位置为止。
Output
从1号顶点开始按照深度优先遍历顺序输出图G中的每个顶点,顶点编号间用一个空格间隔,每个无向图的输出占用一行。
Sample Input
0 1 1 0 0 1 0 0 0 1 1 0 0 1 1 0 0 1 0 1 0 1 1 1 0 0 1 1 1 1 0 0 0 1 0 0 1 1 0 1 0
Sample Output
1 2 5 3 4 1 2 3 4
#include<stdio.h>
#include<string.h>
int lin[100][100];
int flag[1000];
int a;
void dfs(int s){
int i;
if(flag[s]==0){
printf(" %d",s);
flag[s]=1;
}
for(i=1;i<=a;i++){
if(lin[s][i]==1){
if(flag[i]==0){
printf(" %d",i);
flag[i]=1;
dfs(i);
}
}
}
}
int main(){
int i,j;
while(1){
memset(flag,0,sizeof(flag));
for(i=1;i<100;i++){
scanf("%d",&lin[1][i]);
if(getchar()=='\n'){
a=i;
break;
}
}
for(i=2;i<=a;i++){
for(j=1;j<=a;j++){
scanf("%d",&lin[i][j]);
}
}
printf("1");
flag[1]=1;
for(i=1;i<=a;i++){
dfs(i);
}
printf("\n");
if( getchar()=='\n' )continue;
else break;
}
return 0;
}