图的深度遍历

题目描述

请定一个无向图,顶点编号从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

 1 #include <stdio.h>

 2 #include <string.h>

 3 int p[101][101],count[101],num[101],z;

 4 

 5 void dfs(int k,int v)

 6 {

 7     int i;

 8     count[v] = 1;

 9     num[z] = v;

10     z++;

11     for(i = 0;i <= k-1;i ++)

12     {

13         if(p[v][i] == 1 && count[i] == 0)

14         {

15             dfs(k,i);

16         }

17     }

18 }

19 

20 int main()

21 {

22     int n,k,m,u,v,i,h,j,t;

23     scanf("%d",&n);

24     for(h=1;h<=n;h++)

25     {

26         memset(p,0,sizeof(p));

27         memset(count,0,sizeof(count));

28         memset(num,0,sizeof(num));

29         scanf("%d%d",&k,&m);

30         z = 0;

31         t = 0;

32         for(i=1;i<=m;i++)

33         {

34             scanf("%d%d",&u,&v);

35             p[v][u]=1;

36             p[u][v]=1;

37         }

38         for(i=0;i<=k-1;i++)

39         {

40             for(j=0;j<=k-1;j++)

41             {

42                 if(p[i][j]==1)

43                 {

44                     dfs(k,i);

45                     t=1;

46                     break;

47                 }

48             }

49             if(t==1)

50             break;

51         }

52         for(i=0;i<=z-1;i++)

53         {

54             if(i!=z-1)

55             printf("%d ",num[i]);

56             else

57             printf("%d\n",num[i]);

58         }

59     }

60 }

 

你可能感兴趣的:(遍历)