思路:直接用并查集,最后统计有多少棵树,减 1 即为 结果
用 scanf 要比 cin 速度 快一些 , 尽量 用scanf 做题
代码1:用scanf
#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
const int maxn=30000 +100;
int set[maxn];
int set_find(int d)
{
if(set[d]<0)
return d;
return set[d]=set_find(set[d]);
}
void join(int x,int y)
{
x=set_find(x);
y=set_find(y);
set[x]=y;
}
int main()
{
int n,m;
while(scanf("%d",&n) && n!=0 && scanf("%d",&m))
{
memset(set,-1,sizeof(set));
int a,b;
while(m--)
{
scanf("%d %d",&a,&b);
if(set_find(a)!=set_find(b))
join(a,b);
}
int i;
int sum=0;
for(i=1;i<=n;i++)
if(set[i]==-1)
sum++;
printf("%d\n",sum-1);
}
return 0;
}
代码2:用cin
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=30000 +100;
int set[maxn];
int set_find(int d)
{
if(set[d]<0)
return d;
return set[d]=set_find(set[d]);
}
void join(int x,int y)
{
x=set_find(x);
y=set_find(y);
set[x]=y;
}
int main()
{
int n,m;
while(cin>>n && n!=0 && cin>>m)
{
memset(set,-1,sizeof(set));
int a,b;
while(m--)
{
cin>>a>>b;
if(set_find(a)!=set_find(b))
join(a,b);
}
int i;
int sum=0;
for(i=1;i<=n;i++)
if(set[i]==-1)
sum++;
cout<<sum-1<<endl;
}
return 0;
}