2017-09-01

并查集一个神奇的算法

今天我们的s同学想学习一下并查集,就去找了几个水题刷一下...


入门题:P2839 畅通工程

就是求联通块的数量,-1就是答案。

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int read(){
    int f=1,an=0;
    char ch=getchar();
    while(!('0'<=ch&&ch<='9')){if(ch=='-')f=-f;ch=getchar();}
    while('0'<=ch&&ch<='9'){an=an*10+(ch-'0');ch=getchar();}
    return f*an;
}
int f[1000+99];bool c[1000+99];
int n,m,ans;
int from,to;
void add(int x,int y){
    int xx=x,yy=y;
    while(xx!=f[xx])xx=f[xx];
    while(yy!=f[yy])yy=f[yy];
    if(xx!=yy)f[xx]=yy;
}
int find(int i){
    int k=i;
    while(f[k]!=k){c[k]=0;k=f[k];}
}
int main(){
    n=read();m=read();
    for(int i=1;i<=n;i++){f[i]=i;c[i]=1;}
    for(int i=1;i<=m;i++){
        from=read();
        to=read();
        add(from,to);
    }
    for(int i=1;i<=n;i++){
        find(i);}
    for(int i=1;i<=n;i++)if(c[i])ans++;
    cout<<ans-1;
    return 0;
}
畅通工程

相关文章: