[BZOJ 1040] [ZJOI2008] 骑士 【基环+外向树DP】
题目链接:BZOJ - 1040
题目分析
这道题目的模型就是一个图,不一定联通,每个连通块的点数等于边数。
每个连通块都是一个基环+外向树。即树上增加了一条边。
如果是树,就可以直接树形DP了。然而这是基环+外向树,需要先找到环上的一条边,记录这条边的两个端点 R1, R2,删掉这条边。
然后分两种情况:一定不选R1;一定不选R2;对这两种情况分别做一次树形DP就可以了。
答案加上这两种情况的答案的较大值。
代码
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdio> using namespace std; const int MaxN = 1000000 + 5; typedef long long LL; const LL INF = 99999999999999999; int n, R, R1, R2, Rt;
int A[MaxN]; LL Ans, Temp;
LL F[MaxN][2]; bool Visit[MaxN]; struct Edge
{
int u, v, t;
Edge *Next;
} E[MaxN * 2], *P = E, *Point[MaxN]; inline void AddEdge(int x, int y, int z)
{
++P; P -> u = x; P -> v = y; P -> t = z;
P -> Next = Point[x]; Point[x] = P;
} inline LL gmax(LL a, LL b) {return a > b ? a : b;} void DFS(int x, int y)
{
Visit[x] = true;
for (Edge *j = Point[x]; j; j = j -> Next)
{
if (j -> t == y) continue;
if (Visit[j -> v])
{
R1 = x;
R2 = j -> v;
Rt = j -> t;
}
else DFS(j -> v, j -> t);
}
} void Solve(int x, int y)
{
F[x][0] = 0; F[x][1] = A[x];
for (Edge *j = Point[x]; j; j = j -> Next)
{
if (j -> t == y || j -> t == Rt) continue;
Solve(j -> v, j -> t);
F[x][0] += gmax(F[j -> v][0], F[j -> v][1]);
F[x][1] += F[j -> v][0];
}
if (x == R) F[x][1] = -INF;
} int main()
{
scanf("%d", &n);
int a;
for (int i = 1; i <= n; ++i)
{
scanf("%d%d", &A[i], &a);
AddEdge(i, a, i);
AddEdge(a, i, i);
}
memset(Visit, 0, sizeof(Visit));
Ans = 0;
for (int i = 1; i <= n; ++i)
{
if (Visit[i]) continue;
DFS(i, 0);
R = R1;
Solve(i, 0);
Temp = gmax(F[i][0], F[i][1]);
R = R2;
Solve(i, 0);
Temp = gmax(Temp, gmax(F[i][0], F[i][1]));
Ans += Temp;
}
printf("%lld\n", Ans);
return 0;
}
[BZOJ 1040] [ZJOI2008] 骑士 【基环+外向树DP】的更多相关文章
- 1040: [ZJOI2008]骑士~基环外向树dp
Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在和平环境中 ...
- BZOJ 1040: [ZJOI2008]骑士 基环加外向树
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1190 Solved: 465[Submit][Status] ...
- [bzoj] 1040 骑士 || 基环外向树dp
原题 给出n个点n条边和每个点的点权,一条边的两个断点不能同时选择,问最大可以选多少. //图是一张基环外向树森林 是不是很像舞会啊- 就是多了一条边. 所以我们考虑一下对于一棵基环外向树,拆掉一条在 ...
- bzoj 1040: [ZJOI2008]骑士 環套樹DP
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1755 Solved: 690[Submit][Status] ...
- BZOJ 1040 [ZJOI2008]骑士 (基环树+树形DP)
<题目链接> 题目大意: Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的 ...
- 【BZOJ】1040: [ZJOI2008]骑士(环套树dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1040 简直不能再神的题orz. 蒟蒻即使蒟蒻,完全不会. 一开始看到数据n<=1000000就 ...
- HYSBZ 1040 骑士 (基环外向树DP)
Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在和平环境中 ...
- 初涉基环外向树dp&&bzoj1040: [ZJOI2008]骑士
基环外向树dp竟然如此简单…… Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发 ...
- 【BZOJ1040】[ZJOI2008] 骑士(基环外向树DP)
点此看题面 大致题意: 给你一片基环外向树森林,如果选定了一个点,就不能选择与其相邻的节点.求选中点的最大权值和. 树形\(DP\) 此题应该是 树形\(DP\) 的一个升级版:基环外向树\(DP\) ...
随机推荐
- labview下UDP通信
本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 因项目需要,用labview写了个UDP通信测试程序,原理图如下: 前面板 后面板: 运行效果:
- 聊聊 iOS 中的网络加密
介绍下 公司的接口一般会两种协议的,一种HTTP,一种HTTPS的,HTTP 只要请求,服务器就会响应,如果我们不对请求和响应做出加密处理,所有信息都是会被检测劫持到的,是很不安全的,客户端加密可以使 ...
- IT行业智力测试
1.有10筐苹果,其中有1筐是次品,正品苹果每个10两,次品苹果每个9两,现有一称,问怎么一次称出次品是哪筐? 2.有甲.乙.丙.丁四个人,要在夜里过一座桥.他们通过这座桥分别需要耗时1.2.5.10 ...
- Linux重复执行上一条命令
执行刚刚执行的一条命令: !! 执行最近一个以指定字符串开头的命令(比如man) !man !m 引用上一个命令的最后一个参数 !$ <ESC>, .
- C#一般处理程序获取Session
如果需要用ajax去动态校验验证码,如何获取Session保存的值呢? 你需要做两步: 一.在你的一般处理程序中添加命名空间 (using System.Web.SessionState;) 二.在你 ...
- php字符串函数(1)
下面去学习一下php的字符串函数,那么怎么去看手册呢,举个例子 int strcasecmp ( string $str1 , string $str2 ) 第一个int,表示此函数返回的类型是int ...
- 如何写robots.txt?
robin 发表在 八月 2, 2006 在国内,网站管理者似乎对robots.txt并没有引起多大重视,应一些朋友之请求,今天想通过这篇文章来简单谈一下robots.txt的写作. robots.t ...
- declare-styleable:自定义控件的属性
http://www.cnblogs.com/jisheng/archive/2013/01/10/2854891.html 在使用过程中, 1 TypedArray a = getContext() ...
- C#转Python计划
1.学习python语法,完成python_cookbook上的代码. 目标:熟悉python语法和开发习惯,以及调试方法. 2.学习使用Django框架,完成一个基于Django框架的项目,发布到g ...
- 通过css实现文本超出部分以省略号(......)代替
一.单行溢出 1,固定宽度(非常容易) text-overflow: ellipsis; 2,不固定宽度 思路:想让这个区域成为块元素,然后不换行,溢出隐藏. display: block; whit ...