我也是醉了。。。。。。
第一份WA的代码:
#include<iostream>
#include<stdio.h>
using namespace std;
#include<string.h>
int par[1001],rank[1001],flag[1001],n;
void init()
{
int i;
for(i=0;i<=n;i++)
{
par[i]=i;
rank[i]=0;
}
}
int find(int x)
{
if(par[x]==x)
{
return x;
}
else
return par[x]=find(par[x]);
}
void unite(int x,int y)
{
x=find(x);
y=find(y);
if(x==y)
return ;
if(rank[x]<rank[y])
par[x]=y;
else
{
par[y]=x;
if(rank[x]==rank[y])
rank[x]++;
}
}
int main()
{
int m;
while(cin>>n,n)
{
scanf("%d",&m);
init();
int a,b,i;
while(m--)
{
scanf("%d%d",&a,&b);
unite(a,b);
}
int number=0;
memset(flag,0,sizeof(flag));
for(i=1;i<=n;i++)
{
flag[par[i]]=1;
}
for(i=1;i<=n;i++)//就是这个地方。。。注意。。。
{
if(flag[i]==1)
number++;
}
cout<<number-1<<endl;
}
}
我AC的代码;
#include<iostream>
#include<stdio.h>
using namespace std;
#include<string.h>
int par[1001],rank[10001],n;
void init()
{
int i;
for(i=0;i<=n;i++)
{
par[i]=i;
rank[i]=0;
}
}
int find(int x)
{
if(par[x]==x)
{
return x;
}
else
return par[x]=find(par[x]);
}
void unite(int x,int y)
{
x=find(x);
y=find(y);
if(x==y)
return ;
if(rank[x]<rank[y])
par[x]=y;
else
{
par[y]=x;
if(rank[x]==rank[y])
rank[x]++;
}
}
int main()
{
int m;
while(cin>>n,n)
{
scanf("%d",&m);
init();
int a,b,i;
while(m--)
{
scanf("%d%d",&a,&b);
unite(a,b);
}
int number=0;
for(i=1;i<=n;i++)
{
if(par[i]==i)
{
number++;
}
}
cout<<number-1<<endl;
}
}
最后一份是我学长的代码:
比我的简洁好多呀
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define N 1003
int main()
{
int n,m,v[N],i,x,y,t;
while(scanf("%d%d",&n,&m),n)
{
memset(v,0,sizeof(v));t=1;
for(i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
while(v[x]>0)
x=v[x];
while(v[y]>0)
y=v[y];
if(x!=y)
{
v[y]=x;
t++;
}
}
printf("%d\n",n-t);
}
return 0;
}
但是运行时间都是一样的O.O