并查集
这道题优化效果不明显
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int father[1005];
int getfather(int i)
{
while(father[i]!=-1)
{
i=father[i];
}
return i;
}
void Union(int x,int y)
{
int fx=getfather(x);
int fy=getfather(y);
if(fx==fy)
return ;
else
father[fx]=fy;
}
int main()
{
int n,m;
int i,j;
while(cin>>n&&n)
{
cin>>m;
memset(father,-1,sizeof(father));
for(i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
Union(x,y);
}
int num[1005];
memset(num,0,sizeof(num));
for(i=1;i<=n;i++)
num[getfather(i)]=1;
int sum=-1;
for(i=1;i<=n;i++)
if(num[i])
sum++;
cout<<sum<<endl;
}
return 0;
}