并查集水题,判断加了多少条边
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
int father[1001];
int n,m;
void init()
{
for(int i = 0;i<=n;i++)
{
father[i] = i;
}
}
int findx(int r)
{
int i = r,j;
while(r!=father[r])
{
r = father[r];
}
while(father[i]!=r)
{
j = father[i];
father[i] = r;
i = j;
}
return r;
}
int merg(int x,int y)
{
int uu = findx(x);
int vv = findx(y);
if(uu!=vv)
{
father[uu] = vv;
return 1;
}
else
return 0;
}
int main()
{
int a,b;
while(~scanf("%d%d",&n,&m))
{
if(n==0) break;
init();
int num = 1;
for(int i = 0;i<m;i++)
{
scanf("%d%d",&a,&b);
int st = merg(a,b);
if(st==1) num++;
}
printf("%d\n",n-num);
}
return 0;
}