洛谷 P1536 村村通(并查集)

嗯...

题目链接:https://www.luogu.org/problemnew/show/P1536

思路:

  这道题可以看出是并查集的思想,然后用一个while嵌套一下,输入一条路的两个端点,就将这两个端点合并,表示这两个地方可以互相到达。然后从1到n for 一遍,如果这个点的父亲和它本身相同(即它并没有与其他任何的点并在一起),就将数量+1,注意现在的ans是点的个数,要修的路的个数即为点的个数减一。

AC代码:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 
 5 using namespace std;
 6 
 7 int f[100005];
 8 int n, m, x, y;
 9 
10 inline int find(int x){
11     if(x != f[x])
12         f[x] = find(f[x]);
13     return f[x];
14 }//"查 "
15 
16 int main(){
17     while(true){
18         int ans = 0;
19         scanf("%d", &n);
20         if(n == 0)
21             return 0;//结束 
22         scanf("%d", &m);
23         for(int i = 1; i <= n; i++)
24             f[i] = i;
25         for(int i = 1; i <= m; i++){
26             scanf("%d%d", &x, &y);
27             int r1 = find(x);
28             int r2 = find(y);
29             if(r1 != r2){
30                 f[r1] = r2;
31             }//"并"  
32         }
33         for(int i = 1; i <= n; i++){
34             if(find(i) == i){//没与任何点并在一起 
35                 ans++;//点的个数 
36             }
37         }
38         printf("%d
", ans - 1);//要修的路的条数 
39     }
40     return 0;
41 }    
AC代码
原文地址:https://www.cnblogs.com/New-ljx/p/10846625.html