• P1536村村通


    这是一个并查集的题,被洛谷评为提高—。

    拿到这个题便看出了这是一个裸的并查集,于是就写了一个模板,结果发现连输入都输不进去,一看竟然是多组数据,,然后看到N==0结束,于是便加了一层while。之后提交发现RE了,于是想到shh大佬曾经说RE就是递归写错了,于是仔细检查,发现真的写错了,,然后AC。

    1.并查集get_f那一段的函数要仔细写

    2.多组数据的话,单循环直接break,多循环记录一个flag,然后break

    3.多组数据就算出一组输出一组(我再去问问lz)

    代码

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #define N 1000001
    using namespace std;
    int n,m;
    int ans[N];
    int f[N];
    void  init(){
        for(int i=1;i<=n;i++){
            f[i]=i;
        } 
        return;
    }
    int get_f(int v){
        if(f[v]==v) return f[v];
        else return f[v]=get_f(f[v]);
    }
    void merge(int u,int v){
        int t1=get_f(u);
        int t2=get_f(v);
        if(t1!=t2){
            f[min(t1,t2)]=t1+t2-min(t1,t2); 
        }
    } 
    int cnt=0;
    int main(){
        while(true){
            cin>>n>>m;
            if(n==0){    
                return 0;
            }
            else{
                for(int i=1;i<=n;i++){
                    f[i]=i;
                }
                cnt++;    
                for(int i=1;i<=m;i++){
                    int x,y;
                    cin>>x>>y;
                    merge(x,y);
                }
                for(int i=1;i<=n;i++){
                    if(get_f(i)==i){
                        ans[cnt]++;//有几个单独的路 
                    }
                } 
                cout<<ans[cnt]-1<<endl;
            }
        }
        return 0;
    }
    待到oi十一月,我花开后百花杀。
  • 相关阅读:
    [APIO2012]派遣
    Luogu_2774 方格取数问题
    Luogu4149 [IOI2011]Race
    Luogu_4886 快递员
    Loj_6282. 数列分块入门 6
    LOJ 6281 数列分块入门 5
    三维偏序 cdq
    【逆序对】 模板
    【luogu P1637 三元上升子序列】 题解
    【luogu P3609 [USACO17JAN]Hoof, Paper, Scissor蹄子剪刀布】 题解
  • 原文地址:https://www.cnblogs.com/china-mjr/p/11241053.html
Copyright © 2020-2023  润新知