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; }