我们用并查集求出共有多少个集合,然后总集合减一就是题目的解,
如果你去计算共连通了多少步,最后一组测试数据你一定会超时。
#include<stdio.h>
#include<string.h>
const int maxn = 1001;
int father[maxn],rank[maxn];
struct node
{
int x;
int y;
}list[maxn*maxn];
int n,m,cnt;
int finds(int x)
{
if(x==father[x]) return x;
else return finds(father[x]);
}
void bing(int x,int y)
{
int xx=finds(x);
int yy=finds(y);
if(xx!=yy)
{
if(rank[xx]>rank[yy])
{
father[xx] = father[yy];
rank[xx]+=rank[yy];
}
else
{
father[yy] = father[xx];
rank[yy]+=rank[xx];
}
}
}
int main()
{
int i,x,y;
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
scanf("%d",&m);
for(i=1;i<=n;i++) father[i]=i;
for(i=1;i<=n;i++) rank[i] = 1;
for(i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
bing(x,y);
}
int sum=0;
for(i=1;i<=n;i++)
{
if(finds(i)==i) sum++;
}
printf("%d\n",sum-1);
}
return 0;
}