zoukankan      html  css  js  c++  java
  • 列出连通集

    列出连通集

    给定一个有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 }
     1 #include<stdio.h>
     2 #include<set>
     3 #define MAXSIZE 15
     4 using namespace std;
     5 int n,m;
     6 int visited[MAXSIZE];
     7 set<int> mp[MAXSIZE];
     8 void init(){
     9    for(int i = 0; i < MAXSIZE; i++){
    10      visited[i] = 0;
    11    }
    12 }
    13  
    14 void DFS(int k){
    15   if(visited[k]==1){
    16     return ;
    17   }
    18   visited[k] = 1;
    19   printf(" %d",k);
    20   for(set<int>::iterator it = mp[k].begin(); it != mp[k].end(); it++){      //set的遍历
    21     DFS(*it);         
    22   }
    23 }
    24 void BFS(int k){                 //BFS模板
    25   visited[k] = 1;
    26   printf(" %d",k);
    27   int Q[15];                        //简易队列的实现
    28   int last = 1;
    29   int pre = 0;
    30   Q[0] = k;
    31   while(pre < last){
    32     int d = Q[pre];
    33     pre++;
    34     for(set<int>::iterator it = mp[d].begin(); it != mp[d].end(); it++){
    35       if(visited[*it]==0){
    36         visited[*it] = 1;
    37         printf(" %d",*it);
    38         Q[last] = *it;
    39         last++;
    40       }
    41     }
    42   }
    43 }
    44  
    45 int main(){
    46   scanf("%d %d",&n,&m);
    47   for(int i = 0; i < m; i++){
    48     int a,b;
    49     scanf("%d %d",&a,&b);
    50     mp[a].insert(b);              //set的插入
    51     mp[b].insert(a);
    52   }
    53   init();
    54   for(int i = 0; i < n; i++){
    55     if(visited[i]!=1){
    56       printf("{");
    57       DFS(i);
    58       printf(" }
    ");
    59     }
    60   }
    61   init();
    62   for(int i = 0; i < n; i++){
    63     if(visited[i]!=1){
    64       printf("{");
    65       BFS(i);
    66       printf(" }
    ");
    67     }
    68   }
    69   return 0;
    70 }

     注意点:

    • set的遍历与插入
    • DFS、BFS的模板
    • 队列的实现
  • 相关阅读:
    package相关知识
    【算法设计与分析】5个数7次比较排序的算法
    Android下的应用编程——用HTTP协议实现文件上传功能
    5个数通过7次比较排序的方法
    数据库范式(1NF、2NF、3NF、BCNF)
    HttpDownloader2011年09月20日 写好用于下载的类 并且封装好
    POJ 1692 DP
    POJ 1682 多重DP
    TYVJ 1744 逆序对数(加强版)
    POJ 2151 概率DP
  • 原文地址:https://www.cnblogs.com/jinjin-2018/p/8999537.html
Copyright © 2011-2022 走看看