//并查集
int get(int x){return x==f[x]?x:f[x]=get(f[x]);}
void init(int x,int y)
{
int xx=get(x);
int yy=get(y);
if(xx!=yy)f[yy]=xx;
}
//带权并查集
int get(int x)
{
if(x!=f[x])
{
int t=f[x];
f[x]=get(f[x]);
v[x]+=v[t];
}
return f[x];
}
void init(int x,int y,int z)
{
int xx=get(x);
int yy=get(y);
if(xx!=yy)
{
f[xx]=yy;
v[xx]=-v[x]+v[y]+z;
}
}
1.Wireless Network POJ - 2236
int n,D,d[1010][1010];
int f[1010],ff[1010];
struct node{int x,y;}w[1010];
int get(int x){return x==f[x]?x:f[x]=get(f[x]);}
int main()
{
scanf("%d%d",&n,&D);
D=D*D;
for(int i=1;i<=n;i++)scanf("%d%d",&w[i].x,&w[i].y),f[i]=i,ff[i]=0;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
d[i][j]=d[j][i]=(w[i].x-w[j].x)*(w[i].x-w[j].x)+(w[i].y-w[j].y)*(w[i].y-w[j].y);
}
}
char s[5];
while(~scanf("%s",s))
{
if(s[0]=='S')
{
int x,y;scanf("%d%d",&x,&y);
if(ff[x]&&ff[y]&&get(x)==get(y))printf("SUCCESS\n");
else printf("FAIL\n");
}
if(s[0]=='O')
{
int x;scanf("%d",&x);ff[x]=1;
for(int i=1;i<=n;i++)
{
if(ff[i]&&d[x][i]<=D)
{
int xx=get(x);
int yy=get(i);
if(xx!=yy)f[yy]=xx;
}
}
}
}
return 0;
}
2.The Suspects POJ - 1611
int n,m;
int f[30010];
int get(int x){return x==f[x]?x:f[x]=get(f[x]);}
int main()
{
while(~scanf("%d%d",&n,&m)&&(m||n))
{
for(int i=0;i<n;i++)f[i]=i;
for(int i=0;i<m;i++)
{
int k;scanf("%d",&k);
int y;
for(int j=0;j<k;j++)
{
int x;scanf("%d",&x);
if(j==0)y=x;
else
{
int xx=get(x);
int yy=get(y);
if(xx!=yy)f[yy]=xx;
}
}
}
int ans=1;
int f=get(0);
for(int i=1;i<n;i++)
{
if(get(i)==f)ans++;
}
printf("%d\n",ans);
}
return 0;
}
3.How Many Tables HDU - 1213
int t,n,m;
int f[1010];
int get(int x){return x==f[x]?x:f[x]=get(f[x]);}
void init(int x,int y)
{
int xx=get(x);
int yy=get(y);
if(xx!=yy)f[yy]=xx;
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)f[i]=i;
while(m--)
{
int x,y;scanf("%d%d",&x,&y);
init(x,y);
}
int ans=0;
for(int i=1;i<=n;i++)if(f[i]==i)ans++;
printf("%d\n",ans);
}
return 0;
}
4.How Many Answers Are Wrong HDU - 3038
带权并查集
该题注意区间重复
int n,m,f[200010],v[200010];
int get(int x)
{
if(x!=f[x])
{
int t=f[x];
f[x]=get(f[x]);
v[x]+=v[t];
}
return f[x];
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=0;i<=n;i++)f[i]=i,v[i]=0;
int ans=0;
for(int i=0;i<m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
x--;
int xx=get(x);
int yy=get(y);
if(xx==yy)
{
if((v[x]-v[y])!=z)ans++;
}
else
{
f[xx]=yy;
v[xx]=-v[x]+v[y]+z;
}
}
printf("%d\n",ans);
}
return 0;
}