AcWing 837. 数组写法连通块中点的数量的数组写法
原题链接
简单
作者:
柳晨荫
,
2021-04-17 22:22:54
,
所有人可见
,
阅读 244
#include<iostream>
using namespace std;
const int N=1e5+10;
int p[N][2];
int find(int x)
{
if(p[x][0]!=x) p[x][0]=find(p[x][0]);
//必须是递归
//if(p[x][0]!=x) p[x][0]=p[p[x][0]][0];
return p[x][0];
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
p[i][0]=i;
p[i][1]=1;
}
while(m--)
{
string op;
int a,b;
cin>>op;
if(op=="C")
{
scanf("%d%d",&a,&b);
if(find(a)!=find(b))
{
//这样写法,必须先更新数量,否则在更新父亲节点后,就丢失信息了
//还是cnt分开写比较好
p[find(b)][1]+=p[find(a)][1];
p[find(a)][0]=find(b);
}
}
else if(op=="Q1")
{
scanf("%d%d",&a,&b);
if(find(a)!=find(b))
{
cout<<"No"<<endl;
}
else
{
cout<<"Yes"<<endl;
}
}
else
{
scanf("%d",&b);
cout<<p[find(b)][1]<<endl;
}
}
}