列出连通集——DFS+BFS

来源:互联网 发布:mac 查看音轨 编辑:程序博客网 时间:2024/06/03 17:59

think:
1深度优先搜索体现了递归的思想,广度优先搜索体现了队列的思想

6 列出连通集 (25分)

给定一个有NNN个顶点和EEE条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1N-1N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。

输入格式:
输入第1行给出2个整数NNN(0

测试点1    答案正确    15/15   2   1   sample 两种顺序不同,也有相同,有未出现的单个顶点测试点2    答案正确    8/8     1   11个是单独点,最大N测试点3    答案正确    2/2     18  1   NE最小

以下为答案正确代码

#include <stdio.h>#include <string.h>int vis[14], e[14][14], link[14], op, tp;void DFS(int x, int n);//深度优先搜索void BFS(int x, int n);//广度优先搜索int main(){    int n, m, u, v, i;    while(scanf("%d %d", &n, &m) != EOF)    {        memset(vis, 0, sizeof(vis));//vis数组初始化(vis数组标记当前结点是否被访问过)        memset(e, 0, sizeof(e));//e数组初始化(e数组记录结点之间是否存在路径)        for(i = 0; i < m; i++)        {            scanf("%d %d", &u, &v);            e[u][v] = e[v][u] = 1;        }        for(i = 0; i < n; i++)        {            if(vis[i] == 0)            {                printf("{");                DFS(i, n);//深度优先搜索                printf(" }\n");            }        }        op = tp = 0;//队列标记变量初始化        memset(vis, 0, sizeof(vis));//vis数组初始化(vis数组标记当前结点是否被访问过)        for(i = 0; i< n; i++)        {            if(vis[i] == 0)            {                printf("{");                BFS(i, n);//广度优先搜索                printf(" }\n");            }        }    }    return 0;}void DFS(int x, int n)//深度优先搜索{    int i;    printf(" %d", x);    vis[x] = 1;    for(i = 0; i < n; i++)    {        if(vis[i] == 0 && e[x][i] == 1)        {            DFS(i, n);//深度优先搜索(递归思想)        }    }}void BFS(int x, int n)//广度优先搜索(队列思想){    int i, f1;    link[tp++] = x;//当前结点入队    vis[x] = 1;    while(op < tp)    {        f1 = link[op++];//头结点出队        printf(" %d", f1);        for(i = 0; i < n; i++)        {            if(vis[i] == 0 && e[f1][i] == 1)            {                vis[i] = 1;                link[tp++] = i;//当前结点入队            }        }    }}
0 0
原创粉丝点击