题目描述:有N个节点,一开始任意两个节点都没有相连,之后有两种操作:
1: 将 A 节点和 B 节点连接起来。
2: 问从A节点出发可以直接或间接到达的节点数量。
如果 A 节点和 B 节点被连接起来了,那么从A可以到达B,同时从B也可以到达A。
整体思路:一道简单的并查集
代码实现如下:
#include<stdio.h>
#include<string.h>
const int maxn=1010;
int fa[maxn],total[maxn];
int Find(int a){
return a==fa[a]?a:fa[a]=Find(fa[a]);
}
void Merge(int a,int b){
int x=Find(a);
int y=Find(b);
if(x==y) return;
fa[y]=x;
total[x]+=total[y];
total[y]=1;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
fa[i]=i;
total[i]=1;
}
int a,b,p;
for(int i=0;i<m;i++){
scanf("%d",&p);
if(p==1){
scanf("%d%d",&a,&b);
Merge(a,b);
}
else{
scanf("%d",&a);
int x=Find(a);
printf("%d\n",total[x]);
}
}
}
}