• 题目1012:畅通工程


    题目描述:

        某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?

    输入:

        测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M;随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号。为简单起见,城镇从1到N编号。 
        注意:两个城市之间可以有多条道路相通,也就是说
        3 3
        1 2
        1 2
        2 1
        这种输入也是合法的
        当N为0时,输入结束,该用例不被处理。

    输出:

        对每个测试用例,在1行里输出最少还需要建设的道路数目。

    样例输入:
    4 2
    1 3
    4 3
    3 3
    1 2
    1 3
    2 3
    5 2
    1 2
    3 5
    999 0
    0
    样例输出:
    1
    0
    2
    998
    
     1 #include <set>  //1526
     2 #include <map>
     3 #include <list>
     4 #include <cmath>
     5 #include <ctime>
     6 #include <deque>
     7 #include <queue>
     8 #include <stack>
     9 #include <cstdio>
    10 #include <string>
    11 #include <vector>
    12 #include <cctype>
    13 #include <cstring>
    14 #include <sstream>
    15 #include <fstream>
    16 #include <cstdlib>
    17 #include <cassert>
    18 #include <iostream>
    19 #include <algorithm>
    20  
    21 using namespace std;
    22  
    23  
    24  
    25  
    26 const int MAX = 100005;
    27  
    28 int pre[MAX];
    29  
    30 int Ans;
    31  
    32  
    33  
    34  
    35 int find(int x)
    36 { 
    37     int r = x; 
    38     while(pre[r] != r) 
    39         r = pre[r]; 
    40     int i = x; 
    41     int j; 
    42     while(i != r) 
    43     { 
    44         j = pre[i]; 
    45         pre[i] = r; 
    46         i = j; 
    47     } 
    48  
    49     return r;
    50 }
    51 void Merge(int x,int y)
    52 {
    53     int xf = find(x);
    54     int yf = find(y);
    55     if(xf != yf)
    56     {
    57         pre[xf] = yf;
    58         --Ans;
    59     }
    60 }
    61  
    62 int main()
    63 {
    64     int N,M,i,x,y;
    65  
    66     while(cin >> N >> M)
    67     {
    68         if(N == 0) 
    69             break;
    70  
    71         Ans = N; 
    72  
    73         for(i = 1;i <= N; ++i) 
    74             pre[i] = i;
    75  
    76         while( M-- )
    77         {
    78             cin >> x >> y;
    79             Merge(x,y);
    80         }
    81         Ans--;
    82         cout<<Ans<<endl;
    83     }
    84 } 
    
    
  • 相关阅读:
    Kafka学习笔记之kafka高版本Client连接0.9Server引发的血案排查
    机器学习笔记之python实现朴素贝叶斯算法样例
    机器学习笔记之python实现支持向量机SVM算法样例
    机器学习笔记之AdaBoost算法详解以及代码实现
    机器学习笔记之python实现关联规则算法Apriori样例
    机器学习笔记之python实现AdaBoost算法
    F-47(copy 邓大顾)
    js 设置标题 空白
    微信授权验证
    iphone web 时间 问题
  • 原文地址:https://www.cnblogs.com/chchche/p/3466038.html
Copyright © 2020-2023  润新知