图的深度遍历

题目描述

请定一个无向图,顶点编号从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];//标记边
 4 int o[101];//标记点
 5 int num[101];//存遍历完的点
 6 int z;
 7 //dfs算法
 8 void dfs(int k,int v)
 9 {
10     int j;
11     o[v] = 1;
12     num[z++] = v;
13     for(j = 0;j <= k-1;j ++)
14     {
15         if(p[v][j] == 1 && o[j] == 0)
16         {
17             dfs(k,j);
18         }
19     }
20 }
21 
22 int main()
23 {
24     int n,k,m,u,v,i,j,t;
25     scanf("%d",&n);
26     while(n--)
27     {
28         memset(p,0,sizeof(p));
29         memset(o,0,sizeof(o));
30         memset(num,0,sizeof(num));
31         scanf("%d%d",&k,&m);
32         z = 0;
33         t = 0;
34         for(i=1;i<=m;i++)
35         {
36             scanf("%d%d",&u,&v);
37             p[v][u]=1;
38             p[u][v]=1;
39         }
40         for(i=0;i<=k-1;i++)
41         {
42             for(j=0;j<=k-1;j++)
43             {
44                 if(p[i][j]==1)
45                 {
46                     dfs(k,i);
47                     t = 1;
48                     break;
49                 }
50             }
51             if(t) break;
52         }
53         for(i=0;i<=z-1;i++)
54         {
55             if(i!=z-1)
56             printf("%d ",num[i]);
57             else
58             printf("%d\n",num[i]);
59         }
60     }
61 }
View Code

 

posted @ 2013-07-30 15:27  海东青飞吧!  阅读(272)  评论(0编辑  收藏  举报