数据结构(18)——深度优先遍历

来源:互联网 发布:大数据就业前景怎么样 编辑:程序博客网 时间:2024/06/05 19:11

C - 深度优先遍历

Description

请定一个无向图,顶点编号从0到n-1,用深度优先搜索(DFS),遍历并输出。遍历时,先遍历节点编号小的。

Input

输入第一行为整数n(0 < n < 100),表示数据的组数。 对于每组数据,第一行是两个整数k,m(0 < k < 100,0 < m < k*k),表示有m条边,k个顶点。 下面的m行,每行是空格隔开的两个整数u,v,表示一条连接u,v顶点的无向边。

Output

输出有n行,对应n组输出,每行为用空格隔开的k个整数,对应一组数据,表示DFS的遍历结果。

Sample Input

1
4 4
0 1
0 2
0 3
2 3

Sample Output

0 1 2 3

#include<string.h>#include <algorithm>using namespace std;int que[111], sum;int a[10101][10110];int vis[1111];                              //标记是否走过void dfs(int u, int v){    que[sum++] = u;                     //一次存入每次可以通过的节点    vis[u] = 1;                         //标记为已走    for (int i = 0; i<v; i++)    {        if (a[u][i] == 1 && vis[i] == 0)    //寻找与当前节点相连通并且未走的节点        {            dfs(i, v);            //que[sum++]=aim; //该语句可以存入原路返回的节点        }    }}int main(){    int n, m, k;    int i, j;    scanf("%d", &n);    while (n--)    {        scanf("%d%d", &k, &m);        memset(a, 0, sizeof(a));        memset(vis, 0, sizeof(vis));        //初始化,所有定点均未走过        while (m--)        {            scanf("%d%d", &i, &j);            a[i][j] = a[j][i] = 1;        }        sum = 0;        dfs(0, k);        for (i = 0; i<sum; i++)            printf(i == sum - 1 ? "%d\n" : "%d ", que[i]);    }    return 0;}
1 0