图的深度遍历

来源:互联网 发布:淘宝上好的外贸店 编辑:程序博客网 时间:2024/06/06 01:53

题目描述

请定一个无向图,顶点编号从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的遍历结果。

示例输入

14 40 10 20 32 3

示例输出

0 1 2 3

提示


#include <stdio.h>#include <stdlib.h>#include <string.h>int p[101][101];//标记边int o[101];//标记点int num[101];//存遍历完的点int z;void  DFS(int k,int v){    int j;    o[v] = 1;    num[z++] = v;    for(j = 0;j <= k-1;j++)    {        if(p[v][j] == 1 && o[j] == 0)        {            DFS(k,j);        }    }}int main(){    int n,k,m,u,v,i,j,t;    scanf("%d",&n);    while(n--)    {        memset(p,0,sizeof(p));        memset(o,0,sizeof(o));        memset(num,0,sizeof(num));        scanf("%d %d",&k,&m);        z = 0;        t = 0;        for(i = 1;i <= m;i++)        {            scanf("%d %d",&u,&v);            p[v][u] = 1;            p[u][v] = 1;        }        for(i = 0;i <= k-1;i++)        {            for(j = 0; j <= k-1;j++)            {                if(p[i][j] == 1)                {                    DFS(k,i);                    t = 1;                    break;                }            }            if(t)                break;        }        for(i = 0;i <= z-1 ;i++)        {            if(i != z - 1)                printf("%d ",num[i]);            else                printf("%d\n",num[i]);        }    }    return 0;} 


0 0