虽然乍一看连通块 感觉好像和图有关然而其实并没有什么关系,所以不需要用图来做。因为要求的是点所在集合的数量,两点是否在同一个集合,以及将两点的集合合并所以这是一个典型的并查集问题
三个核心操作分别如下
合并
分别找出两点所在集合, 将其中一个点所对应集合的所有点所在集合指向被添加集合,被添加集合的点数=原点数+添加点数
两个查询操作就不需要多说了 ,注意这里由于操作码是Q1所以不用char op[2];而用string,
代码如下
```c++
//这里填你的代码^^
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~
include[HTML_REMOVED]
using namespace std;
const int N =100010;
int n ,m;
int p[N],cnt[N];//cnt为计数,记录x点所在集合包含点总数
int find(int x){
if(p[x]!=x)p[x]=find(p[x]);
return p[x];
}
void merge(){
int a ,b;
cin>>a>>b;
a = find(a),b=find(b);
if(a!=b){
p[a]=b;
cnt[b]+=cnt[a];
}
}
int main(){
cin>>n>>m;
for(int i =1;i<=n;i++){
p[i]=i;
cnt[i]=1;
}
while(m–){
string op;
cin>>op;
if(op==”C”)merge();
else if(op==”Q1”){
int a ,b;
cin>>a>>b;
if(find(a)==find(b))puts(“Yes”);
else puts(“No”);
}
else{int a;
cin>>a;
cout<<cnt[find(a)]<<endl;
}
}
return 0;
}
```