#sXDPybttg050210. 1584:骑士
1584:骑士
好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:
题目描述
原题来自:ZJOI 2008
Z 国的骑士团是一个很有势力的组织,帮会中聚集了来自各地的精英。他们劫富济贫,惩恶扬善,受到了社会各界的赞扬。
可是,最近发生了一件很可怕的事情:邪恶的 Y 国发起了一场针对 Z 国的侵略战争。战火绵延五百里,在和平环境中安逸了数百年的 Z 国又怎能抵挡得住 Y 国的军队。于是人们把所有希望都寄托在了骑士团身上,就像期待有一个真龙天子的降生,带领正义打败邪恶。
骑士团是肯定具备打败邪恶势力的能力的,但是骑士们互相之间往往有一些矛盾。每个骑士有且仅有一个他自己最厌恶的骑士(当然不是他自己),他是绝对不会与最厌恶的人一同出征的。
战火绵延,人们生灵涂炭,组织起一个骑士军团加入战斗刻不容缓!国王交给你了一个艰巨的任务:从所有骑士中选出一个骑士军团,使得军内没有矛盾的两人,即不存在一个骑士与他最痛恨的人一同被选入骑士团的情况,并且使这支骑士军团最富有战斗力。
为描述战斗力,我们将骑士按照 至 编号,给每位骑士估计一个战斗力,一个军团的战斗力为所有骑士的战斗力之和。
输入格式
输入第一行包含一个正整数 ,描述骑士团的人数;
接下来 行每行两个正整数 ,表示第 名骑士的战斗力和他最痛恨的骑士编号 。
输出格式
输出一行一个整数,表示所选出的骑士军团的最大战斗力。
样例
样例输入
3
10 2
20 3
30 1
样例输出
30
样例解释
三名骑士:
- 骑士1:战斗力10,痛恨骑士2;
- 骑士2:战斗力20,痛恨骑士3;
- 骑士3:战斗力30,痛恨骑士1。
矛盾关系:1 恨 2,2 恨 3,3 恨 1,形成一个环(3个节点的环)。
要求选出一些骑士,使得没有矛盾(即不能同时选 和 )。
在环上,如果选1,则不能选2;选2则不能选3;选3则不能选1。
因为环的大小是3,最多选 个不相邻的骑士?
战斗力:选骑士3(战斗力30)最大,所以输出30。
数据范围
- 对于 的数据,;
- 对于 的数据,;
- 对于 的数据,;
- 对于 的数据,,且每名骑士的战斗力都是不大于 的正整数。
时空限制
- 时间:
- 内存:
提示
此题是 基环树上的最大权独立集 问题。
每个骑士 痛恨 ,相当于在 和 之间连一条无向边。每个骑士有且仅有一个最厌恶的骑士,所以每个节点出度为1,因此整张图是由 个节点、 条边组成的 基环树森林(每个连通分量是基环树,即一棵树加上一条边形成的环)。
我们需要在基环树森林中选出一些节点,使得没有一条边的两个端点同时被选,且选的节点权值和最大。
解题步骤:
- 找到基环树上的环;
- 对于每个基环树,在环上任选一条边 ,分别强制不选 和不选 两种情况,进行树形DP(转化为树的最大权独立集问题);
- 对每个基环树取两种情况的最大值,累加到答案。
树的最大权独立集 DP:
设 表示不选 时,以 为根的子树的最大权值和;
表示选 时,以 为根的子树的最大权值和。
转移:
- $dp[u][0] = \sum_{v \in son(u)} \max(dp[v][0], dp[v][1])$
复杂度 。
注意:因为 可达 ,需要用邻接表存图,并注意递归可能爆栈,需用非递归或显式栈,或增大栈空间。