zoukankan      html  css  js  c++  java
  • PTA 2-1 列出连通集【DFS+BFS基础】

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

    输入格式:

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

    输出格式:

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

    思路
    很基础的DFS,BFS,也是理解的一种方式吧;
    对一个点集的处理。
    DFS深搜一个集合,属于一个集合,以及不属于。
    BFS广搜一个集合,属于一个集合,以及不属于。

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <stack>
    #include <queue>
    #include <map>
    #include <set>
    #include <vector>
    #include <math.h>
    #include <algorithm>
    using namespace std;
    #define LL long long
    #define INF 0x3f3f3f3f
    const double pi = acos(-1.0);
    const int mod = 1e9+7;
    
    const int N=1e2+10;
    
    bool vis[N];
    int ma[N][N];
    int n;
    int d[N];
    
    void dfs(int x)
    {
        for(int i=0;i<n;i++)
        {
            if(!vis[i]&&ma[x][i])
            {
                vis[i]=1;
                printf(" %d",i);
                dfs(i);
            }
        }
    }
    
    queue<int>q;
    void bfs(int x)
    {
        while(!q.empty())
            q.pop();
        q.push(x);
        while(!q.empty())
        {
            int u=q.front();q.pop();
            for(int i=0;i<n;i++)
            {
                if(!vis[i]&&ma[u][i])
                {
                    vis[i]=1;
                    printf(" %d",i);
                    q.push(i);
                }
            }
        }
    }
    
    
    
    int main()
    {
        int m;
        int a,b;
        cin>>n>>m;
        memset(ma,0,sizeof(ma));
        memset(vis,0,sizeof(vis));
    
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&a,&b);
            ma[a][b]=ma[b][a]=1;
        }
    
    
        memset(vis,0,sizeof(vis));
        for(int i=0;i<n;i++)
        {
            if(!vis[i])
            {
                vis[i]=1;
                printf("{ %d",i);
                dfs(i);
                printf(" }
    ");
            }
        }
        memset(vis,0,sizeof(vis));
        for(int i=0;i<n;i++)
        {
            if(!vis[i])
            {
                vis[i]=1;
                printf("{ %d",i);
                bfs(i);
                printf(" }
    ");
            }
        }
        return 0;
    }
    
    /*
    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 }
    */
  • 相关阅读:
    leetcode--Populating Next Right Pointers in Each Node II
    leetcode—Populating Next Right Pointers in Each Node
    Pascal's Triangle II
    leetcode—pascal triangle
    leetcode—triangle
    October 23rd, 2017 Week 43rd Monday
    October 22nd, 2017 Week 43rd Sunday
    October 21st 2017 Week 42nd Saturday
    October 20th 2017 Week 42nd Friday
    October 19th 2017 Week 42nd Thursday
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934486.html
Copyright © 2011-2022 走看看