news 2026/10/17 2:45:10

洛谷 P2607:[ZJOI2008] 骑士 ← 基环森林 + 最大权独立集 + 并查集找环 + “断边法”破环

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
洛谷 P2607:[ZJOI2008] 骑士 ← 基环森林 + 最大权独立集 + 并查集找环 + “断边法”破环

【题目来源】
https://www.luogu.com.cn/problem/P2607
https://www.acwing.com/problem/content/1082/

【题目描述】
Z 国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英。他们劫富济贫,惩恶扬善,受到社会各界的赞扬。
最近发生了一件可怕的事情,邪恶的 Y 国发动了一场针对 Z 国的侵略战争。战火绵延五百里,在和平环境中安逸了数百年的 Z 国又怎能抵挡的住 Y 国的军队。于是人们把所有的希望都寄托在了骑士团的身上,就像期待有一个真龙天子的降生,带领正义打败邪恶。
骑士团是肯定具有打败邪恶势力的能力的,但是骑士们互相之间往往有一些矛盾。每个骑士都有且仅有一个自己最厌恶的骑士(当然不是他自己),他是绝对不会与自己最厌恶的人一同出征的。
战火绵延,人民生灵涂炭,组织起一个骑士军团加入战斗刻不容缓!国王交给了你一个艰巨的任务,从所有的骑士中选出一个骑士军团,使得军团内没有矛盾的两人(
不存在一个骑士与他最痛恨的人一同被选入骑士军团的情况),并且,使得这支骑士军团最具有战斗力。
为了描述战斗力,我们将骑士按照 1 至 n 编号,给每名骑士一个战斗力的估计,一个军团的战斗力为所有骑士的战斗力总和。

【输入格式】
第一行包含一个整数 n,描述骑士团的人数。
接下来 n 行,每行两个整数,按顺序描述每一名骑士的战斗力和他最痛恨的骑士。

【输出格式】
应输出一行,包含一个整数,表示你所选出的骑士军团的战斗力。

【输入样例】
3
10 2
20 3
30 1

【输出样例】
30

【数据范围】
对于 30% 的测试数据,满足 n≤10;
对于 60%的测试数据,满足 n≤100;
对于 80%的测试数据,满足 n≤10^4。
对于 100%的测试数据,满足 1≤n≤10^6,每名骑士的战斗力都是不大于 10^6 的正整数。

【算法分析】
· 每个骑士 i 向他讨厌的骑士连一条无向边。
· 共 n 个点、n 条边,且不保证连通 ⇒
基环森林。
· 约束“讨厌的两人不能同时选”,使得总战斗力最大 ⇒
最大权独立集。
· 挂树部分照常用 f[u][0/1],“破环”用断边法。其中:
f[u][0]:不选骑士 u 时,以 u 为根的子树最大战斗力;
f[u][1]:选中骑士 u 时,以 u 为根的子树最大战斗力。


【算法代码】

#include <bits/stdc++.h> using namespace std; typedef pair<int,int> PII; typedef long long LL; const int N=1e6+5; vector<PII> roots; vector<int> g[N]; int pre[N],val[N]; LL f[N][2]; int n; int find(int x) { if(x!=pre[x]) pre[x]=find(pre[x]); return pre[x]; } LL dfs(int u,int fa) { f[u][1]=val[u]; f[u][0]=0; for(int j:g[u]) { if(j==fa) continue; dfs(j,u); f[u][1]+=f[j][0]; f[u][0]+=max(f[j][0],f[j][1]); } return f[u][0]; } int main() { scanf("%d",&n); for(int i=1; i<=n; i++) pre[i]=i; for(int i=1; i<=n; i++) { int x; scanf("%d%d", &val[i],&x); int a=find(i); int b=find(x); if(a!=b) { pre[a]=b; g[i].push_back(x); g[x].push_back(i); } else roots.push_back({x,i}); } LL sum=0; for(PII t:roots) { int x=t.first, y=t.second; LL ans=dfs(x,-1); ans=max(ans,dfs(y,-1)); sum+=ans; } printf("%lld",sum); return 0; } /* in: 3 10 2 20 3 30 1 out: 30 */



【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/140691777

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/17 2:44:53

56.实战PostgreSQL-pgvector-FastAPI构建轻量级RAG

实战&#xff1a;PostgreSQL pgvector FastAPI 构建轻量级 RAG 码海寻道 大模型、智能体与 RAG 工程组件系列第 56 篇 本篇用一个轻量方案串起 RAG 最小闭环&#xff1a;PostgreSQL 保存 Chunk 和业务元数据&#xff0c;pgvector 保存向量&#xff0c;FastAPI 提供检索接口。…

作者头像 李华
网站建设 2026/10/17 2:44:28

Python 闭包:为什么函数能记住早就销毁的变量

我感觉的闭包 刚学 Python 的时候&#xff0c;跟着课程走&#xff0c;感觉 Python 就那样也不难啊&#xff0c;直到我碰到了闭包。闭包是我感觉从学 Python 开始&#xff0c;用的时间最长的一小节课程 &#xff0c;44分钟的课程反反复复看了好几遍。 后来真的弄明白了&#xff…

作者头像 李华
网站建设 2026/10/17 2:44:14

page_alloc build_all_zonelists

build_all_zonelists() 是内核中 zonelist 构建的统一入口函数&#xff0c;负责在系统启动和内存热插拔两种场景下&#xff0c;为 NUMA 节点建立内存分配时的 zone 尝试顺序。核心作用与定位zonelist 决定了分配内存时按什么顺序尝试各个 zone 和节点。build_all_zonelists() 根…

作者头像 李华
网站建设 2026/10/17 2:44:08

2026年大厂Agent开发岗真实门槛深度拆解,小白程序员必备!

本文深度剖析了2026年大厂Agent开发岗的真实门槛&#xff0c;指出会LangChain、LangGraph或跑通Agent Demo并不足以胜任工作。文章强调工程能力和业务思维的重要性&#xff0c;分析了架构设计、Tool Calling、线上稳定性、项目深挖等方面的关键要求&#xff0c;并提出了提升竞争…

作者头像 李华
网站建设 2026/10/17 2:42:43

FastReport 2022-3 VCL源码集成与跨Delphi版本定制指南

简介&#xff1a;本资源为FastReport 2022-3 VCL Enterprise完整源码包&#xff0c;专为Delphi中高级开发者设计&#xff0c;适用于D7至D12全版本VCL框架下的报表深度定制与二次开发场景。资源包含2000个文件&#xff0c;主体为559个Pascal源码&#xff08;.pas&#xff09;、7…

作者头像 李华
网站建设 2026/10/17 2:42:41

SolidJS 由 Ryan Carniato 发起,采用 MIT 开源协议,社区维护

2026 年的前端框架格局已经发生了深刻变化。React 用 Server Components 重新定义了组件模型&#xff0c;Vue 3.5 用 Vapor 模式抛弃了虚拟 DOM&#xff0c;Svelte 5 用 Runes 统一了响应式语法。 但在众多框架中&#xff0c;SolidJS 以其独特的"细粒度响应式"理念脱…

作者头像 李华