• 洛谷 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代码
  • 相关阅读:
    JDK源码阅读--AbstractStringBuilder
    JDK源码阅读--String
    JDK源码阅读--Object
    linux查看日志
    velocity 相关
    oracle Trigger
    ssm调用后台oracle存储过程统计分析数据
    oracle 优化相关
    synchronized 控制并发(活动秒杀)
    SpringBoot自动装配的原理
  • 原文地址:https://www.cnblogs.com/New-ljx/p/10846625.html
Copyright © 2020-2023  润新知