P2024 [NOI2001] 食物链
1.928. 尽量减少恶意软件的传播 II2.P1339 [USACO09OCT] Heat Wave G3.P4779 【模板】单源最短路径(标准版)4.P1550 [USACO08OCT] Watering Hole G5.P4568 [JLOI2011] 飞行路线6.P3956 [NOIP2017 普及组] 棋盘7.单词 Play on Words8.P7771 【模板】欧拉路径
9.P2024 [NOI2001] 食物链
10.P1525 [NOIP2010 提高组] 关押罪犯11.P2573 [SCOI2012] 滑雪12.E. Count Paths13.P1351 [NOIP2014 提高组] 联合权值题解
带权并查集的应用,普通的并查集只能表示结点间的一种关系(如同一集合中的都是朋友)。而带权并查集的结点权值表示该结点与根结点的关系。相对应,带权并查集的路径压缩也复杂了一点。
code
#include<bits/stdc++.h> using namespace std; const int N=5e4+5; int n,k; int father[N],dis[N]; void build(){ for (int i=1;i<=n;i++){ father[i]=i; dis[i]=0; } } int find(int x){ if (father[x]!=x){ int r=find(father[x]); dis[x]=(dis[x]+dis[father[x]])%3; father[x]=r; } return father[x]; } int main(){ cin>>n>>k; build(); int sum=0; for (int i=1;i<=k;i++){ int d,x,y; cin>>d>>x>>y; if (x>n || y>n || (x==y && d==2)){ sum++; continue; } int fx=find(x),fy=find(y); if (fx==fy){ if ((dis[y]-dis[x]+3)%3!=d-1) sum++; } else { dis[fy]=(dis[x]+d-1-dis[y]+3)%3; father[fy]=fx; } } cout<<sum<<endl; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通