洛谷 P1892 [BOI2003] 团伙 种类并查集 扩展域并查集
1.【算法学习】排序2.【算法学习】Manacher 马拉车3.【算法学习】KMP 算法4.LCA 最近公共祖先(树链和倍增)这次真有树链了!!!5.线段覆盖问题6.【算法学习】学换根dp有感7.二分图最大匹配8.【算法学习】01BFS
9.洛谷 P1892 [BOI2003] 团伙 种类并查集 扩展域并查集
10.【算法学习】高斯消元法11.贝叶斯公式12.背包13.【算法学习】模拟退火14.【算法学习】基环树15.【算法学习】树链部分16.【算法学习】莫队17.【算法学习】分块九讲18.平衡树19.圆方树20.【算法学习】点分治21.公式22.【算法学习】笛卡尔树23.【算法学习】悬线法24.欧几里得算法与 EX25.【算法学习】逆元与求解26.【算法学习】费马定理27.三分28.裴蜀定理29.【算法学习】欧拉函数φ30.【算法学习】二维转一维问题31.【算法学习】扫描线32.【算法学习】矩阵乘法33.【算法学习】同余最短路34.【算法学习】组合数学35.【算法学习】反悔贪心种类并查集!!!!
存敌人
主要要理解敌人的敌人就是朋友这句话,我们就可以用并查集来维护朋友,用一个数组来储存他的其中一个敌人,后面遇到其他他的敌人时,将他的敌人用并查集连起来成为朋友。
注意这题要你输出团队数而不是团队的人数不会就我这么唐吧。
#include <bits/stdc++.h> using namespace std; const int N=1005; int n,m; int fa[N]; int a[N]; int find(int x){ return fa[x]==x?x:find(fa[x]); } void add(int u,int v){ int x=find(u); int y=find(v); fa[x]=y; } int cnt[1005]; int ans; int main(){ ios::sync_with_stdio(false); cin>>n>>m; for(int i=1;i<=n;i++){ fa[i]=i; } for(int i=1;i<=m;i++){ char c; int u,v; cin>>c>>u>>v; if(c=='F'){ add(u,v); } else{ if(!a[u]){ a[u]=v; } else{ add(a[u],v); } if(!a[v]){ a[v]=u; } else{ add(a[v],u); } } } for(int i=1;i<=n;i++){ if(fa[i]==i){ ans++; } } cout<<ans; return 0; }
反集
当然这题的方法开两倍空间进行维护,或者说叫反集。
#include <bits/stdc++.h> using namespace std; const int N=2005; int n,m; int fa[N]; int find(int x){ return fa[x]==x?x:find(fa[x]); } void add(int u,int v){ int x=find(u); int y=find(v); fa[x]=y; } int ans; int main(){ ios::sync_with_stdio(false); cin>>n>>m; for(int i=1;i<=n*2;i++){ fa[i]=i; } for(int i=1;i<=m;i++){ char c; int u,v; cin>>c>>u>>v; if(c=='F'){ add(u,v); } else{ add(u+n,v); add(v+n,u); } } for(int i=1;i<=n;i++){ if(fa[i]==i){ ans++; } } cout<<ans; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)