传送门:畅通工程
- 实质是求连通分支的数量
#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;
}