列出连通集——DFS+BFS

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 
#include 
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;//当前结点入队
            }
        }
    }
}

你可能感兴趣的:(温习反思,DFS,BFS)