图的深度遍历
Time Limit: 1000MS Memory limit: 65536K
题目描述
请定一个无向图,顶点编号从0到n-1,用深度优先搜索(DFS),遍历并输出。遍历时,先遍历节点编号小的。
输入
输入第一行为整数n(0 < n < 100),表示数据的组数。 对于每组数据,第一行是两个整数k,m(0 < k < 100,0 < m < k*k),表示有m条边,k个顶点。 下面的m行,每行是空格隔开的两个整数u,v,表示一条连接u,v顶点的无向边。
输出
输出有n行,对应n组输出,每行为用空格隔开的k个整数,对应一组数据,表示DFS的遍历结果。
示例输入
1 4 4 0 1 0 2 0 3 2 3
示例输出
0 1 2 3
提示
邻接矩阵记录图因为是无向图,所以每输入都会使两个点记录,然后dfs, 注意在dfs中 判断条件 a[i][j] == 1 即证明有这一条路 , flag[j] ==0 表示这个点没有被搜索过
来源
示例程序
#include <stdio.h>
#include <string.h>
int a[100][100] ;
int b[100] , t ;
int flag[100] ;
void dfs(int i,int k)
{
for(int j = 0 ; j < k ; j++)
{
if(a[i][j] == 1 && flag[j]==0)
{
if(flag[i] == 0)
{
b[t++] = i ;
flag[i] = 1 ;
}
if(flag[j] == 0)
{
b[t++] = j ;
flag[j] = 1 ;
}
a[i][j] = 0 ;
a[j][i] = 0 ;
dfs(j,k);
}
}
return ;
}
int main()
{
int q ,p , n , m , k , j , i ;
scanf("%d", &n);
for(q = 0 ; q < n ; q++)
{
memset(a,0,sizeof(a));
memset(flag,0,sizeof(flag));
t = 0 ;
scanf("%d %d", &k, &m);
for(p = 0 ; p < m ; p++)
{
scanf("%d %d", &i, &j);
a[i][j] = 1 ;
a[j][i] = 1 ;
}
for(p = 0 ; p < k ; p++)
//if(flgg[p])
dfs(p,k);
for(i = 0 ; i < t ; i++)
{
printf("%d", b[i]);
if(i == t-1)
printf("\n");
else
printf(" ");
}
}
}