[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\) ...
随机推荐
- \n 与 \r 在记事本中的内容表现方式 原创
总结:[0D,0A]的顺序才可以记事本才可以正常显示回车换行,其他EDITPLUS ,等编缉工具在下面三种情况下都可以换行 原始数据与表现形式 [0D,0A]序列才可以正常显示回车换行 --- ...
- linux 基础学习图解
http://www.cnblogs.com/xiaoluo501395377/category/465892.html
- 字符串匹配算法-BM
在用于查找子字符串的算法中,BM(Boyer-Moore)算法是当前有效且应用比较广泛的一种算法,各种文本编辑器的“查找”功能(Ctrl+F),大多采用Boyer-Moore算法.比我们学习的KMP算 ...
- IT行业智力测试
1.有10筐苹果,其中有1筐是次品,正品苹果每个10两,次品苹果每个9两,现有一称,问怎么一次称出次品是哪筐? 2.有甲.乙.丙.丁四个人,要在夜里过一座桥.他们通过这座桥分别需要耗时1.2.5.10 ...
- jdk1.5多线程Lock接口及Condition接口
jdk1.5多线程的实现的方式: jdk1.5之前对锁的操作是隐式的 synchronized(对象) //获取锁 { } //释放锁 jdk1.5锁的操作是显示的:在包java.util.concu ...
- Retrofit2源码分析(一)
本文将顺着构建请求对象→构建请求接口→发起同步/异步请求的流程,分析retrofit2是如何实现的. 组成部分 Retrofit2源码主要分为以下几个部分: retrofit retrofit-ada ...
- django开发框架之jumpserver
发现一个不错的开源堡垒机 jumpserver: https://github.com/ibuler/jumpserver 最开始看的是jumpserver2.0.0 版本,具体的实现方式是: 1. ...
- webservice未能加载文件或程序集“**.DLL”或它的某一个依赖项。
方法1.C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files先删除这个下面所有的文件,然后把bin里面的引用的dl ...
- php错误处理和异常处理
PHP错误处理有两种:标准的错误处理和异常(OOP语法新出现的错误处理机制)
- jquery ajax获取和解析数据
最近项目中用到了ajax技术,之前虽然写过一点点,但是没有系统的总结过.趁着刚刚用过,手热就记录一下,方便以后查阅. $.ajax中的参数 $.ajax的函数格式: $.ajax({ type: 'P ...