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 }
    */
  • 相关阅读:
    为什么叫Windows 7 ?
    关于多线程生命周期原理
    关于浏览器创建XMLHttpRequest对象
    关于ajax异步加载XML例子
    关于多线程简单原理
    指针和指针的引用
    linux学习点滴
    GCC,GDB,Makefile
    妙语集锦
    uc/os内存管理的理解
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934486.html
Copyright © 2011-2022 走看看