刚网上学完并查集,哟西,还挺好用的。
主要写一个find()和一个join().
void find(int x)
{
int r=x;
while (r!=pre[r])
r=pre[r];
return r;
}
void find(int x,int y)
{
x=find(x);
y=find(y);
if (x!=y)
pre[y]=x;
}
ok!用上即可解决问题!
#include <stdio.h>
int pre[1001];
int find(int x)
{
int r=x;
while(r!=pre[r])
{
r=pre[r];
}
return r;
}
void join(int x,int y,int &total)
{
x=find(x);
y=find(y);
if (x!=y)
{
pre[y]=x;
total--;
}
}
int main()
{
int n,m,p1,p2,i,total;
while (scanf("%d%d",&n,&m)&&n!=0)
{
total=n-1;
for (i=1;i<=n;i++)
pre[i]=i;
for (i=0;i<m;i++)
{
scanf("%d%d",&p1,&p2);
join(p1,p2,total);
}
printf("%d\n",total);
}
return 0;
}