#sXDPybttg050210. 1584:骑士

1584:骑士

好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:


题目描述

原题来自:ZJOI 2008

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

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

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

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

为描述战斗力,我们将骑士按照 11NN 编号,给每位骑士估计一个战斗力,一个军团的战斗力为所有骑士的战斗力之和。


输入格式

输入第一行包含一个正整数 NN,描述骑士团的人数;

接下来 NN 行每行两个正整数 vi,hiv_i, h_i,表示第 ii 名骑士的战斗力和他最痛恨的骑士编号 hih_i


输出格式

输出一行一个整数,表示所选出的骑士军团的最大战斗力。


样例

样例输入

3
10 2
20 3
30 1

样例输出

30

样例解释

三名骑士:

  • 骑士1:战斗力10,痛恨骑士2;
  • 骑士2:战斗力20,痛恨骑士3;
  • 骑士3:战斗力30,痛恨骑士1。

矛盾关系:1 恨 2,2 恨 3,3 恨 1,形成一个环(3个节点的环)。

要求选出一些骑士,使得没有矛盾(即不能同时选 iihih_i)。

在环上,如果选1,则不能选2;选2则不能选3;选3则不能选1。
因为环的大小是3,最多选 3/2=1\lfloor 3/2 \rfloor = 1 个不相邻的骑士?
战斗力:选骑士3(战斗力30)最大,所以输出30。


数据范围

  • 对于 30%30\% 的数据,N10N \le 10
  • 对于 60%60\% 的数据,N100N \le 100
  • 对于 80%80\% 的数据,N104N \le 10^4
  • 对于 100%100\% 的数据,N106N \le 10^6,且每名骑士的战斗力都是不大于 10610^6 的正整数。

时空限制

  • 时间:1000 ms1000 \text{ ms}
  • 内存:524288 KB524288 \text{ KB}

提示
此题是 基环树上的最大权独立集 问题。

每个骑士 ii 痛恨 hih_i,相当于在 iihih_i 之间连一条无向边。每个骑士有且仅有一个最厌恶的骑士,所以每个节点出度为1,因此整张图是由 NN 个节点、NN 条边组成的 基环树森林(每个连通分量是基环树,即一棵树加上一条边形成的环)。

我们需要在基环树森林中选出一些节点,使得没有一条边的两个端点同时被选,且选的节点权值和最大。

解题步骤

  1. 找到基环树上的环;
  2. 对于每个基环树,在环上任选一条边 (u,v)(u,v),分别强制不选 uu 和不选 vv 两种情况,进行树形DP(转化为树的最大权独立集问题);
  3. 对每个基环树取两种情况的最大值,累加到答案。

树的最大权独立集 DP
dp[u][0]dp[u][0] 表示不选 uu 时,以 uu 为根的子树的最大权值和;
dp[u][1]dp[u][1] 表示选 uu 时,以 uu 为根的子树的最大权值和。
转移:

  • $dp[u][0] = \sum_{v \in son(u)} \max(dp[v][0], dp[v][1])$
  • dp[u][1]=wu+vson(u)dp[v][0]dp[u][1] = w_u + \sum_{v \in son(u)} dp[v][0]

复杂度 O(N)O(N)

注意:因为 NN 可达 10610^6,需要用邻接表存图,并注意递归可能爆栈,需用非递归或显式栈,或增大栈空间。