并查集——hdu1232(入门)
传送门:畅通工程
- 实质是求连通分支的数量
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int maxn = 50005; int n,m; int a,b,ans; int pre[maxn]; void init() { for(int i=1;i<=n;i++) pre[i] = i; } int findPre(int x) { if(x==pre[x]) return x; return findPre(pre[x]); } void unite(int x,int y) { int rx = findPre(x); int ry = findPre(y); if(rx==ry) return; pre[ry] = rx; } int main() { while(scanf("%d",&n) && n){ scanf("%d",&m); init(); ans = 0; for(int i=1;i<=m;i++){ scanf("%d%d",&a,&b); unite(a,b); } for(int i=1;i<=n;i++){ if(i==pre[i]) ans++; } ans = ans-1; printf("%d\n",ans); } return 0; }