通畅工程

畅通工程

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 69754    Accepted Submission(s): 37335

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
Huge input, scanf is recommended.
 
Source
 
Recommend
JGShining
 
题解:
 1 #include<cstdio>
 2 using namespace std;
 3 int n, m;
 4 int father[1010];
 5 int Rank[1010];
 6 
 7 void init_set() {
 8     for (int i = 1; i <= n; i++) {
 9         father[i] = i;
10         Rank[i] = 1;
11     }
12 }
13 
14 int find_set(int x) {
15     while (x != father[x]) x = father[x];
16     return father[x];
17 }
18 
19 void union_set(int a, int b) {
20     int fatherA = find_set(a);
21     int fatherB = find_set(b);
22     if (fatherA == fatherB) return;
23     else {
24         if (Rank[fatherA] > Rank[fatherB]) {
25             father[fatherB] = fatherA;
26         } else if (Rank[fatherA] < Rank[fatherB]) {
27             father[fatherA] = fatherB;
28         } else {
29             father[fatherB] = fatherA;
30             Rank[fatherA]++;
31         }
32     }
33 }
34 
35 int main() {
36 
37     while (scanf("%d %d", &n, &m)) {
38         if (n == 0) continue;
39         init_set();
40         for (int i = 0; i < m; i++) {
41             int a, b;
42             scanf("%d %d", &a, &b);
43             union_set(a, b);
44         }
45         if (m == 0) {
46             int t;
47             scanf("%d", &t);
48         }
49         int cnt = 0;
50         for (int i = 1; i <= n; i++) {
51             if (father[i] == i) cnt++;
52         }
53         printf("%d\n", cnt - 1);
54     }
55     return 0;
56 }

猜你喜欢

转载自www.cnblogs.com/yfzhou/p/9627057.html