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十一月,我花开后百花杀。
原文地址:https://www.cnblogs.com/china-mjr/p/11241053.html