当前位置: 首页 > news >正文

洛谷 P2607 [ZJOI2008] 骑士-提高+/省选-

题目描述

Z 国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英。他们劫富济贫,惩恶扬善,受到社会各界的赞扬。

最近发生了一件可怕的事情,邪恶的 Y 国发动了一场针对 Z 国的侵略战争。战火绵延五百里,在和平环境中安逸了数百年的 Z 国又怎能抵挡的住 Y 国的军队。于是人们把所有的希望都寄托在了骑士团的身上,就像期待有一个真龙天子的降生,带领正义打败邪恶。

骑士团是肯定具有打败邪恶势力的能力的,但是骑士们互相之间往往有一些矛盾。每个骑士都有且仅有一个自己最厌恶的骑士(当然不是他自己),他是绝对不会与自己最厌恶的人一同出征的。

战火绵延,人民生灵涂炭,组织起一个骑士军团加入战斗刻不容缓!国王交给了你一个艰巨的任务,从所有的骑士中选出一个骑士军团,使得军团内没有矛盾的两人(不存在一个骑士与他最痛恨的人一同被选入骑士军团的情况),并且,使得这支骑士军团最具有战斗力。

为了描述战斗力,我们将骑士按照 111nnn 编号,给每名骑士一个战斗力的估计,一个军团的战斗力为所有骑士的战斗力总和。

输入格式

第一行包含一个整数 nnn,描述骑士团的人数。

接下来 nnn 行,每行两个整数,按顺序描述每一名骑士的战斗力和他最痛恨的骑士。

输出格式

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

输入输出样例 #1

输入 #1

3
10 2
20 3
30 1

输出 #1

30

说明/提示

数据规模与约定

对于 30%30\%30% 的测试数据,满足 n≤10n \le 10n10

对于 60%60\%60% 的测试数据,满足 n≤100n \le 100n100

对于 80%80\%80% 的测试数据,满足 n≤104n \le 10 ^4n104

对于 100%100\%100% 的测试数据,满足 1≤n≤1061\le n \le 10^61n106,每名骑士的战斗力都是不大于 10610^6106 的正整数。

solution

题目大意:基环森林中,不相邻点的距离和的最大值
思路:

  • 找到环上的某个点 u
  • 以 u 和其父节点 fa[u] 为根节点树上 dp 计算 f[i], g[i] ,即包含本节点的子树最大和和不含本节点的子树最大和
  • 结果为 ∑(max(g[u],g[fa[u]])\sum(max(g[u],g[fa[u]])(max(g[u],g[fa[u]]) 其中 u 为每个基环树中环上取一个点

代码


#include<iostream>
#include<vector>
#include "algorithm"
#include "cstring"using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N = 1e6 + 5, M = 1e9 + 7;int n, fa[N], vis[N], a[N];ll f[N], g[N];vector<int> e[N];int find_u(int u) {vis[u] = 1;return vis[fa[u]] ? u : find_u(fa[u]);
}void dp(int u, int p) {vis[u] = 1;for (int v: e[u]) {if (v == p) continue; // p 是起点,相当于断开了起点和其fa的边dp(v, p);f[u] += g[v];g[u] += max(f[v], g[v]);}f[u] += a[u];
}/** 1 反向建图,形成外向基环树* 2 找到环上一个点 u, 以 u 为根节点进行树上 dp*      f[u]:包含本节点的最大值*      g[u]:不包含本节点的最大值* 3 以 fa[u] 为根节点进行树上 dp*      max(g[u], g[fa])*/int main() {cin >> n;for (int i = 1; i <= n; i++) {scanf("%d%d", a + i, fa + i);// cin >> a[i] >> fa[i]; // 反向建图,形成外向基环树e[fa[i]].push_back(i);}ll ans = 0; for (int i = 1; i <= n; i++) {if (!vis[i]) {ll Max = 0;int u = find_u(i);dp(u, u);Max = max(Max, g[u]);memset(f, 0, sizeof f);memset(g, 0, sizeof g);dp(fa[u], fa[u]);Max = max(Max, g[fa[u]]);ans += Max;}}cout << ans << endl;return 0;
}

结果

在这里插入图片描述

http://www.dtcms.com/a/329371.html

相关文章:

  • M4T无人机在外墙脱落监测中的应用:从被动补救到主动预防的技术革新
  • 【代码随想录day 19】 力扣 450.删除二叉搜索树中的节点
  • 从原材料到成品,光模块 PCB 制造工艺全剖析
  • hutool 作为http 客户端工具调用的一点点总结
  • PG靶机 - PayDay
  • pt-online-schema-change 全解析:MySQL 表结构变更的安全之道
  • 编程的几点感悟
  • 【工具】雀语queyu文件批量下载 文档内容复刻导出
  • LeetCode 面试经典 150_数组/字符串_整数转罗马数字(18_12_C++_中等)(模拟)(对各位进行拆解)
  • 地球磁层全球MHD模型中模拟Dst指数的半经验方法
  • 在RHEL 9.X上安装 Docker最新版(28.3.3)
  • 嵌入式|VNC实现开发板远程Debian桌面
  • Spring 源码学习(十)—— DispatcherServlet
  • 专题:2025抖音电商与微短剧行业研究报告|附150+份报告PDF汇总下载
  • 小迪23年-32~40——java简单回顾
  • Hive 创建事务表的方法
  • 机器学习-----DBSCAN算法
  • 进阶向:Python编写自动化邮件发送程序
  • C++多态:理解面向对象的“一个接口,多种实现”
  • [AXI5]AXI协议中awsize和awlen在Vector Atomic地址膨胀中的作用
  • PCIE 配置空间 拓展能力 定义
  • Linux编程 —— framebuffer
  • AJAX学习(2)
  • AI 创作系列(30)海狸 IM:小而全、易二开、快迭代
  • 八爪鱼和影刀的区别和优缺点
  • 【题解】[CQOI2006] 洛谷P4196 凸多边形 /【模板】半平面交
  • AI时代程序员的进化:从代码工人到创意架构师-优雅草卓伊凡引言:AI浪潮下的职业重构
  • Celery在Django中的应用
  • 排序总结---保研机试极限复习
  • 亚马逊聚焦战略2.0:从资源分散到价值聚焦的商业重构逻辑