并查集与反集——P1892团伙
并查集
并查集如其名,合并与查找
- 查找
int find(int key)
{
if(fa[key]==key) return key;
else return fa[key]=find(fa[key]);
}
- 合并
void unite(int x, int y) {
int fax = find(x);
int fay = find(y);
fa[fax] = fay;
return ;
}
反集
处理并查集合并问题的敌对/朋友关系的一种集合
如此时有两个人,吉吉和毛毛,那么两人根据题意只有两种关系,朋友或者敌人(不考虑两人是陌生人),那么根据这两种关系
- 两人是朋友时
合并吉吉与毛毛,并且合并吉吉的敌人和毛毛的敌人 - 两人是敌人时
合并吉吉与毛毛的敌人,合并毛毛与吉吉的敌人
如何实现这一问题?
定义一个数组
到此为止做这道题目的前置知识已经具备,分析题目的意思,我们并不能知道敌人的朋友就是敌人,或者朋友的敌人就是敌人,所以不需要合并朋友的敌人,即为此步骤
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1005;
int fa[maxn*2];
int n,m;
int find(int key)
{
if(fa[key]==key) return key;
else return fa[key]=find(fa[key]);
}
void unite(int x, int y) {
int fax = find(x);
int fay = find(y);
fa[fax] = fay;
return ;
}
int main() {
cin>>n>>m;
for (int i=1;i<=2*n;i++) fa[i]=i;
for (int i=1;i<=m;i++){
char op;
int p,q;
cin>>op>>p>>q;
if(op=='F') unite(p,q);
else if(op=='E') {
unite(p+n,q);
unite(q+n,p);
}
}
int ans=0;
for (int i=1;i<=n;i++)
if(find(i)==i)
ans++;
printf("%d\n", ans);
return 0;
}
P2024这道题目和这个有相似之处,感兴趣的同学可以尝试一下
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」