并查集纯裸板复习
作者:
巷港
,
2022-04-07 23:07:02
,
所有人可见
,
阅读 175
合并集合
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
int p[N];
int n,m;
int find(int x)
{
if (p[x]!=x) p[x]=find(p[x]);
return p[x];
}
int main()
{
cin>>n>>m;
for (int i=1;i<=n;i++) p[i]=i;
while (m--)
{
char op[2];
cin>>op;
int a,b;
cin>>a>>b;
if (op[0]=='M')
{
if (find(a)!=find(b)) p[find(a)]=find(b);
}
else
{
if (find(a)==find(b)) puts("Yes");
else puts("No");
}
}
return 0;
}
连通块中点的数量
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
int p[N];
int cnt[N];
int n,m;
int find(int x)
{
if (p[x]!=x) p[x]=find(p[x]);
return p[x];
}
int main()
{
cin>>n>>m;
for (int i=1;i<=n;i++) p[i]=i,cnt[i]=1;
while (m--)
{
char op[2];
cin>>op;
if (op[0]=='C')
{
int a,b;
cin>>a>>b;
if (find(a)!=find(b))
{
cnt[find(b)]+=cnt[find(a)];
p[find(a)]=find(b);
}
}
else if (op[1]=='1')
{
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;
}