HDU1232畅通工程

(初级打怪版本。。)

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1232

 1 #include <iostream>
 2 #include<cstring>
 3 #include<string>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<queue>
 7 #include<cstdio>
 8 #define ll long long
 9 using namespace std;
10 const int N = 1e3 + 10;
11 int pre[N],sum;
12 void init(int n)//初始化
13 {
14     for(int i = 1; i <= n; i ++)
15     {
16         pre[i] = i;
17     }
18     sum = n-1;//一共需要n-1条路
19 }
20 int find_pre(int i)//查找父亲节点
21 {
22     if(pre[i] == i)return pre[i];
23     return pre[i] = find_pre(pre[i]);
24 }
25 void join(int i,int j)//合并函数
26 {
27     i = find_pre(i);
28     j = find_pre(j);
29     if(i != j)
30     {
31         pre[i] = j;
32         sum--;//如果一条路被连起来,就在总数上减1
33     }
34 
35 }
36 int main()
37 {
38     int n, m, a, b;
39 
40     while(scanf("%d%d",&n,&m) !=EOF)
41     {
42         if(n==0)break;
43         init(n);
44         for(int i = 1; i <= m; i ++)
45         {
46             scanf("%d%d",&a,&b);
47             join(a,b);
48         }
49         printf("%d
",sum);
50     }
51     return 0;
52 }
原文地址:https://www.cnblogs.com/dark-ming/p/13734675.html