集合
集合
集合表一个集体(例如班集体) 例如1,2在一个集合@中 3在集合&中 如果要把他们合并 就把1,2的公共祖先设置为3的公共祖先
定义
int p[N];
//注:N是数字
合并集合和查找是否在一个集合中
#include <bits/stdc++.h>
using namespace std;
int p[100100];
int find(int x)
{
if(x!=p[x])
{
p[x]=find(p[x]);
}
return p[x];
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
p[i]=i;//初始化
}
while(m--)
{
char op[100];
int a,b;
cin>>op>>a>>b;
if(op[0]=='Q')
{
int pa=find(a);//寻找a的父亲
int pb=find(b);//寻找b的父亲
if(pa!=pb)//不是同一个父亲
{
cout<<"No"<<'\n';
}
else
{
cout<<"Yes"<<'\n';
}
}
else
{
int pa=find(a);
int pb=find(b);
if(pa!=pb)
{
p[pa]=pb;//把pb加入pa的集合中
}
}
}
return 0;
}
求集合中点的数量
#include <bits/stdc++.h>
using namespace std;
int si[100110],p[100110];
int find(int x)
{
if(x!=p[x])
{
p[x]=find(p[x]);
}
return p[x];
}
int main()
{
int n,m;
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)//初始化
{
p[i]=i;
si[i]=1;
}
while(m--)
{
string op;
int a,b;
cin>>op;
if(op=="C")
{
cin>>a>>b;
int pa=find(a);
int pb=find(b);
if(pa!=pb)
{
p[pa]=pb;
si[pb]+=si[pa];//增加pa集合点的数量到pb
}
}
else if(op=="Q1")
{
cin>>a>>b;
int pa=find(a);
int pb=find(b);
if(pa!=pb)//判断是否为同一个父亲
{
cout<<"No"<<'\n';
}
else
{
cout<<"Yes"<<'\n';
}
}
else
{
cin>>a;
int pa=find(a);
cout<<si[pa]<<'\n';
}
}
return 0;
}
例题:A-B 数对
[CSP-J2021T3]网络连接