zoukankan      html  css  js  c++  java
  • 06-图1 列出连通集

    题目来源:http://pta.patest.cn/pta/test/18/exam/4/question/624

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

    输入格式:

    输入第1行给出2个整数N(0<N10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。

    输出格式:

    按照"{ v1​​ v2​​ ... vk​​ }"的格式,每行输出一个连通集。先输出DFS的结果,再输出BFS的结果。

    输入样例:

    8 6
    0 7
    0 1
    2 0
    4 1
    2 4
    3 5
    

    输出样例:

    { 0 1 4 2 7 }
    { 3 5 }
    { 6 }
    { 0 1 2 7 4 }
    { 3 5 }
    { 6 }


    #include <cstdio>
    
    #define N 15
    
    void ListComponentsWithDFS();
    void ListComponentsWithBFS();
    void DFS(int V);
    void BFS(int V);
    void InitVisit(void);
    
    int n;
    bool Visited[N];
    int G[N][N] = {0};
    
    int main()
    {
        int E;
    
        scanf("%d%d", &n, &E);
        for (int i = 0; i < E; i++)
        {
            int a, b;
            scanf("%d%d", &a, &b);
            G[b][a] = G[a][b] = 1;
        }
        ListComponentsWithDFS();
        InitVisit();
        ListComponentsWithBFS();
    
        return 0;
    }
    
    void ListComponentsWithDFS()
    {
        for (int V = 0; V < n; V++)
            if (!Visited[V])
            {
                printf("{ ");
                DFS(V);
                printf("}
    ");
            }
    }
    
    void ListComponentsWithBFS()
    {
        for (int V = 0; V < n; V++)
            if (!Visited[V])
            {
                printf("{ ");
                BFS(V);
                printf("}
    ");
            }
    }
    
    void DFS(int V)
    {
        Visited[V] = true;
        printf("%d ", V);
        for (int i = 0; i < n; i++)
        {
            if (G[V][i] && !Visited[i])
                DFS(i);
        }
    }
    
    void BFS(int V)
    {
        const int MAX_SIZE = 100;
        int Queue[MAX_SIZE];
        int first = -1, last = -1;
    
        Queue[++last] = V;      //入队
        Visited[V] = true;
        while (first < last)    //当队不为空时
        {
            int F = Queue[++first];     //出队
            printf("%d ", F);
            for (int i = 0; i < n; i++)
            {
                if (G[F][i] && !Visited[i])
                {
                    Queue[++last] = i;      //入队
                    Visited[i] = true;
                }
            }
        }
    }
    
    void InitVisit()
    {
        for (int i = 0; i < N; i++)
            Visited[i] = false;
    }
  • 相关阅读:
    CSP2019滚粗记
    [总结] wqs二分学习笔记
    [总结] 圆方树学习笔记
    [CF960G] Bandit Blues
    [总结] 第一类斯特林数
    [EOJ629] 两开花
    [CF286E] Ladies' shop
    [总结] 动态DP学习笔记
    [BZOJ3879] SvT
    [总结] 替罪羊树学习笔记
  • 原文地址:https://www.cnblogs.com/llhthinker/p/4844972.html
Copyright © 2011-2022 走看看