• 列出连通集(mooc)


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

    输入格式:

    输入第1行给出2个整数N(0)和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 }

    思路:掌握DFS和BFS。

    #include<cstdio>
    #include<cstring>
    #include<queue>
    using namespace std;
    #define max 100
    int G[max][max];
    int vis[max];
    void DFS(int v,int n){
      vis[v]=1;
      printf(" %d",v);
      for(int i=0;i<n;i++){
        if(vis[i]==0&&G[v][i]>0){
          DFS(i,n);
        }
      }
    }
    void BFS(int v,int n){
      vis[v]=1;
      queue<int> q;
      q.push(v);
      while(!q.empty()){
        int j=q.front();
        q.pop();
        printf(" %d",j);
        for(int i=0;i<n;i++){
          if(G[j][i]&&!vis[i]){
            vis[i]=1;
            q.push(i);
          }
        }
      }
    }
    int main(){
      int n,e;
      scanf("%d %d",&n,&e);
      memset(vis,0,sizeof(vis));
      int v1,v2,i;
      for(i=0;i<e;i++){
        scanf("%d %d",&v1,&v2);
        getchar();
        G[v1][v2]=G[v2][v1]=1;
      }
      //DFS
      for(i=0;i<n;i++){
        if(!vis[i]){
          printf("{");
          DFS(i,n);
          printf(" }
    ");
        }
      }
      //BFS
      memset(vis,0,sizeof(vis));
      for(i=0;i<n;i++){
        if(!vis[i]){
        printf("{");
        BFS(i,n);
        printf(" }
    ");
        }
      }
      return 0;
    }

     

  • 相关阅读:
    空间轴向对齐变换
    购买服务器,搭建服务器服务器
    软件工程第四次作业:猫狗大战挑战赛
    软件工程第三次作业:卷积神经网络
    04卷积神经网络
    03深度学习的数学基础
    mfc回显信息
    软件工程第二次作业:深度学习和pytorch基础
    python 机器学习第二章(感知器学习算法)
    python 机器学习第一章
  • 原文地址:https://www.cnblogs.com/patatoforsyj/p/9874742.html
Copyright © 2020-2023  润新知