zoukankan      html  css  js  c++  java
  • hdu 1232 畅通工程 (并查集)

    畅通工程
    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 68124    Accepted Submission(s): 36340

    Problem Description
    某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?
     
    Input
    测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M;随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号。为简单起见,城镇从1到N编号。
    注意:两个城市之间可以有多条道路相通,也就是说
    3 3
    1 2
    1 2
    2 1
    这种输入也是合法的
    当N为0时,输入结束,该用例不被处理。
     
    Output
    对每个测试用例,在1行里输出最少还需要建设的道路数目。
     
    Sample Input
    4 2
    1 3
    4 3
    3 3
    1 2
    1 3
    2 3
    5 2
    1 2
    3 5
    999 0
    0
     
    Sample Output
    1
    0
    2
    998
     

    C/C++:

     1 #include <map>
     2 #include <queue>
     3 #include <cmath>
     4 #include <string>
     5 #include <cstdio>
     6 #include <cstring>
     7 #include <climits>
     8 #include <algorithm>
     9 #define INF 0xffffff
    10 using namespace std;
    11 
    12 int n, m, my_pre[1010];
    13 
    14 int my_find(int x)
    15 {
    16     int my_temp = x;
    17     while (my_temp != my_pre[my_temp]) my_temp = my_pre[my_temp];
    18     int i = x, j;
    19     while (my_temp != my_pre[i])
    20     {
    21         j = my_pre[i];
    22         my_pre[i] = my_temp;
    23         i = j;
    24     }
    25     return my_temp;
    26 }
    27 
    28 int main()
    29 {
    30     while (scanf("%d", &n), n)
    31     {
    32         int my_cnt = 0, my_first_temp;
    33         scanf("%d", &m);
    34         for (int i = 1; i <= n; ++ i)
    35             my_pre[i] = i;
    36 
    37         for (int i = 1; i <= m; ++ i)
    38         {
    39             int a, b, n1, n2;
    40             scanf("%d%d", &a, &b);
    41             n1 = my_find(a), n2 = my_find(b);
    42             if (n1 != n2)
    43                 my_pre[n1] = n2;
    44         }
    45 
    46         my_first_temp = my_find(1);
    47         for (int i = 2; i <= n; ++ i)
    48             if (my_find(i) != my_first_temp)
    49                 my_pre[my_find(i)] = my_first_temp, ++ my_cnt;
    50 
    51         printf("%d
    ", my_cnt);
    52     }
    53     return 0;
    54 }
  • 相关阅读:
    mysql安装停在make[3]: Leaving directory `/mysql5.xx/mysqltest' 解决方法
    搞了个burst
    PKU2074
    PKU2029
    ACM/ICPC要求的知识点(转)
    PKU3264线段树解法
    PKU2036
    PKU1151线段树解法
    今天递了辞呈
    hamachi
  • 原文地址:https://www.cnblogs.com/GetcharZp/p/9444472.html
Copyright © 2011-2022 走看看