首页 > 其他分享 >【题解】Luogu[P2607] [ZJOI2008] 骑士

【题解】Luogu[P2607] [ZJOI2008] 骑士

时间:2023-07-19 23:25:48浏览次数:32  
标签:int 题解 ll vis P2607 ZJOI2008 max NR dp

题目说给定 \(n\) 个点 \(n\) 个关系,也就是 \(n\) 条边,显然是基环树,又因为没有规定一定连通,于是我们可以将题目简化为给定一个基环树森林,点有点权,相邻的两个点不能同时选,问最大点权和。

part1

我们先考虑如果没有环,只是树,该怎么做。

这一部分很简单,令 \(f_{i,0/1}\) 表示以 \(i\) 为根的子树内,且 \(i\) 号点选或不选的最大点权和。\(u\) 为父节点 \(v\) 为子节点,显然有 \(f_{u,0}=\sum\max(f_{v,1}, f_{v,0})\quad f_{u,1}=\sum\max(f_{v,0})\)

part2

考虑环,如果只有环,该怎么做。

也很简单,与树类似令 \(f_{i,0/1}\) 表示前 \(i\) 个点,且第 \(i\) 个点选或不选的最大点权和。但是此时有个问题就是首尾不能同时选,那么我们不妨强制首选与强制尾选分别做一遍 dp 即可。

part3

现在考虑基环树怎么做。我们会了树怎么做,也会了环怎么做,将他们融合起来。我们知道在环上删除一条边,必能成为一棵树,不妨利用破环为链的思想,将环上一边删去,将其转化为树,于是问题转化为了 part1。

不过要注意断掉的边的两点不能同时选,于是我们利用 part2 的方法,强制两点选和不选,分别做一次 dp 即可。

code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int NR = 1e6 + 5;
const ll MX = 1e18;
int n, a[NR], to[NR];
vector< int > e[NR];
bool vis[NR];
ll root, f[NR][3], ans;
void dp(int x) {
	vis[x] = true, f[x][0] = 0, f[x][1] = a[x];
	for(int i = 0; i < e[x].size(); ++i) {
		int v = e[x][i];
		if(v != root) dp(v), f[x][0] += max(f[v][0], f[v][1]), f[x][1] += f[v][0];
		else f[v][1] = -MX;
	}
} 
void find_circle(int x) {
	vis[x] = true;
	while(!vis[to[x]]) x = to[x], vis[x] = true;
	root = x, dp(x);
	ll num = max(f[x][0], f[x][1]);
	x = root = to[x], dp(x);
	ans += max(num, max(f[x][0], f[x][1]));
}
signed main() {
	ios::sync_with_stdio(false); cin.tie(0), cout.tie(0);
	cin >> n;
	for(int i = 1; i <= n; ++i)
		cin >> a[i] >> to[i], e[to[i]].push_back(i);
	for(int i = 1; i <= n; ++i)
		if(!vis[i]) find_circle(i);
	cout << ans << endl;
	return 0;
}

标签:int,题解,ll,vis,P2607,ZJOI2008,max,NR,dp
From: https://www.cnblogs.com/agrumestly/p/17567012.html

相关文章

  • 基站建设 题解
    基站建设题目大意在平面上存在\(n\)个点,第\(i\)个点的坐标为\((x_i,0)\),具有一个发射半径\(r_i\)和一个费用\(v_i\)。连接具有方向性,当且仅当\(j<i\)且点\(i\)的接收范围与点\(j\)的发射范围相切时点\(i\)才能连接到点\(j\)。第\(i\)个点的发射范围是指一......
  • [ARC104E] Random LIS 题解
    [ARC104E]RandomLIS题解Link吐了,一下午就写了这一个题……主要是题解都说的很草率。然后上课的时候貌似讲的方法不是很能做(也许是我太菜了),总之我得写篇题解整理整理。首先\(n\)很小,可以直接爆搜所有相对大小,即我们去搜索\(1\)到\(n\)的排名,排名可以一样(即\(a_i\)相......
  • RTSP流媒体服务器LntonNVR(源码版)云服务平台下载录像后无法拖动时间轴的问题解决方案
    LntonNVR安防视频云服务平台是基于RTSP/Onvif协议的视频接入、处理及分发平台,可以分发出RTSP、RTMP、WS-FLV、HTTP-FLV、HLS、WebRTC等格式的视频流,可实现在全终端(PC、手机、平板、电子大屏/电视墙等)播放监控视频。有用户反馈,在使用LntonNVR下载录像时,下载后的录像时间无法拖动时间......
  • 【小学期实训】附加题题解——Good Karma
    [状压dp+容斥原理]实训附加题——GoodKarma目录[状压dp+容斥原理]实训附加题——GoodKarma题目描述题目输入格式输出格式数据范围样例输入1样例输出1样例输入2样例输出2样例解释2Solution题目描述题目链接题目「天空度假山庄」中有一个\(n\)点\(m\)边的无向图,图中点......
  • 【小学期实训】附加题题解——最高段位
    [dp状态设计]实训附加题——最高段位目录[dp状态设计]实训附加题——最高段位题目描述背景题目输入格式输出格式数据范围样例输入1样例输出1样例输入2样例输出2样例解释2样例输入3样例输出3Solution题目描述题目链接背景香风智乃除了喜欢玩瓶中船之外,还喜欢打竞技游戏。有......
  • CF786E ALT 题解
    为什么你们第一眼都能想到最小割,我第一眼都只能想到费用流。为什么你们的做法都这么短,我一写就是\(5KB\)。费用流有一个基本矛盾,就是守卫只需拥有一只狗和每一个人都需要守卫有狗的基本矛盾。由于需求与供给不平衡,所以流量不好确定。如果有人费用流过了来长沙火车站,疯狂星期四......
  • [SDOI2010] 代码拍卖会 题解
    [SDOI2010]代码拍卖会题解题目描述一个\(n,n\le10^{18}\)位数,仅由\(1\sim9\)组成,后一位数字一定大于等于前一位数字。求这些数中可以被\(m,m\le500\)整除的有多少,对\(999911659\)取模。解析这个数一定形如\(112334455677788999\)可以把它拆成\[\begin{aligned}......
  • 黑群晖NAS7.0+安装问题解决经验分享
    感谢网上各种帖子及分享,为大家提供一个解决思路,机器配置多种多样,解决办法也仅供参考;1、引导后,无法找到群晖  遇到无法找到群晖的情况,首先要排除引导不兼容的问题。在bios中分别设置传统引导模式和UEFI引导模式尝试启动试下。最新版7.0.1的引导文件是两种启动方式都支持的,理......
  • 题解 [USACO18JAN] MooTube G
    题目链接可以发现,对于一个固定的\(k\),所有边权小于\(k\)的边对答案是没有贡献的,因为一条边的相关性是最小相关性,这也意味着我们不能从\(<k\)的边到达其他的点。由于本题有多组询问,所以对于没有用的边,将其看做被删除,有用的边,将其看做被插入。考虑到本题实际上要维护连通块......
  • 洛谷 P1122 最大子树和 题解
    一道入门的树形DP。首先我们对于数据进行有序化处理,这便于我们利用数据结构特点(可排序性)来发觉数据性质(有序、单调、子问题等等性质),以便于后续的转化、推理和处理。有序化可以“转化和创造”性质首先将视角从无根树切换为有根树,这样我们就可以得到一个带有最优子结构、无后效性......