题目描述
连通块中点的数量
如果a可以走到b,b也可以走到a则说明他们在一个连通块中
连通块实际上是一个由几个点被线连起来后构成的图
可以用树来存储图中的点
将两个点连起来转换成树就相当于将两棵树合并
在两个连通块中连一条边时,相当于将两个集合合并
C++ 代码
#include<iostream>
using namespace std;
const int N=100010;
int q[N];
int sizee[N]; //根节点指代的树中结点的数量 ,N指的是根节点
int n,m;
int find(int x)
{
if(q[x]!=x)q[x]=find(q[x]);
return q[x];
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
q[i]=i;
sizee[i]=1; //刚开始没连的时候每个结点就是一棵树,树中的节点都赋值为1,初始化集合,刚开始时集合中只有一个点
}
while(m--)
{
char op[5];
int a,b;
scanf("%s",op);
if(op[0]=='C') //两棵树中必然没有重复的节点
{
cin>>a>>b;
if(find(a)==find(b))continue; //判断两个点是否在一棵树中,否则就不能将两棵树的节点数量加到一起,a,b在一个集合里时则跳过
sizee[find(b)]+=sizee[find(a)];//相当于每次加1,因为第一个点一定是已经构成树中的一个点,,,只需要看根节点的sizee
q[find(a)]=find(b); //将两棵树合并
}
else if(op[1]=='1')
{
cin>>a>>b;
if(find(a)==find(b))cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
else
{
cin>>a;
cout<<sizee[find(a)]<<endl;//找到所要找的点的根节点,直接输出即可
}
}
return 0;
}