最大父节点相同,则是同一集合
#include<stdio.h>
int a[10000];
int find(int x)
{
if(x==a[x]) return x;//最大父节点已找到
else
{
a[x]=find(a[x]);
return a[x];
}
}
void merge(int x,int y)
{
x=find(x);y=find(y);
a[x]=y;//并集
}
int main()
{
int order,x,y,m,n;
for(int i=0;i<=10000;i++) a[i]=i;
scanf("%d %d",&n,&m);
while(m--)
{
scanf("%d %d %d",&order,&x,&y);
if(order - 2) merge(x,y);
else
{
find(x)==find(y)?printf("Y\n"):printf("N\n");
}
}
return 0;
}
同理
#include<stdio.h>
int a[10000];
int find(int x)
{
if(x==a[x]) return x;
else
{
a[x]=find(a[x]);
return a[x];
}
}
void merge(int x,int y)
{
x=find(x);y=find(y);
a[x]=y;
}
int main()
{
int order,x,y,m,n,p;
scanf("%d %d %d",&n,&m,&p);
for(int i=0;i<=n;i++) a[i]=i;
while(m--)
{
scanf("%d %d",&x,&y);
merge(x,y);
}
while(p--)
{
scanf("%d %d",&x,&y);
if(find(x)==find(y)) printf("Yes\n");
else printf("No\n");
}
return 0;
}