SDUT图的深度遍历之邻接表算法

来源:互联网 发布:linux虚拟机网络设置 编辑:程序博客网 时间:2024/04/28 01:07


图的深度遍历

Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic Discuss

Problem 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的遍历结果。

Example Input

14 40 10 20 32 3

Example Output

0 1 2 3
#include<stdio.h>#include<stdlib.h>#include<string.h>struct mapp{    int data;    mapp *next;};int flag[105];int i;mapp *m[105];void creat(int x, int y){    if(m[x] == NULL)    {        m[x] = new mapp;  //我设置头结点为空 方便后面插入时的排序操作        mapp *p;        p = new mapp;        m[x] ->next = p;        p ->data = y;        p ->next = NULL;    }    else    {        mapp *p = m[x];        mapp *q = p ->next;        while(y > q ->data) //寻找合适位置        {            q = q ->next;            p = p ->next;            if(q == NULL)                break;        }        mapp *o;        o = new mapp;        o ->data = y;        o ->next = q;        p ->next = o;    }}void Dfs(int t){    if(t)        printf(" %d", t);    else        printf("%d", t);    flag[t] = 1;    mapp *p = m[t] ->next;    while(p)    {        if(!flag[p ->data])        {            Dfs(p ->data);        }        p = p ->next;    }}int main(){    int n;    int k, M;    scanf("%d", &n);    while(n--)    {        scanf("%d %d", &k, &M);        if(k == 1)        {            printf("0\n");            break;        }        memset(flag, 0, 105*sizeof(int));        for(i = 0; i < 105; i++)            m[i] = NULL; //更合适的方式是释放内存空间 不过这卡了太久 暂时不想改了        i = 0;        while(M--)        {            int x, y;            scanf("%d %d", &x, &y);            creat(x, y);            creat(y, x);        }        Dfs(0);        printf("\n");    }    return 0;}


图的深度遍历

Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic Discuss

Problem 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的遍历结果。

Example Input

14 40 10 20 32 3

Example Output

0 1 2 3
阅读全文
0 0
原创粉丝点击