bzoj 1040 骑士
这题真不爽,各种WA,写个题解浏览器还挂了,真不爽。
所以不多说了,就说关于判断是否是父节点的问题,不能直接判,会有重边,这种情况只能用编号判,传进去入边的编号,(k^1) != fa,这样就可以了。
要注意的细节很多啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!
上代码:
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#define N 1000100
using namespace std; int n, power[N];
int p[N] = {}, next[N*], v[N*], bnum = -;
long long f1[N][] = {}, f2[N][] = {}; void addbian(int x, int y)
{
bnum++; next[bnum] = p[x]; p[x] = bnum; v[bnum] = y;
bnum++; next[bnum] = p[y]; p[y] = bnum; v[bnum] = x;
} int root, ban;
int cannot;
bool vis[N] = {}; void dfs(int now, int fa)
{
int k = p[now];
while (k != -)
{
if ((k^) != fa && v[k] != ban)
{
if (vis[v[k]])
{
root = v[k];
ban = now;
cannot = k^;
}
else
{
vis[v[k]] = ;
dfs(v[k], k);
}
}
k = next[k];
}
} void makeans_root(int now, int fa)
{
int k = p[now];
if (now == ban)
{
while (k != -)
{
if ((k^) != fa && v[k] != root)
{
makeans_root(v[k], k);
f1[now][] += max(f1[v[k]][], f1[v[k]][]);
f1[now][] += f1[v[k]][];
}
k = next[k];
}
return;
}
f1[now][] = power[now];
while (k != -)
{
if ((k^) != fa && k != cannot)
{
makeans_root(v[k], k);
f1[now][] += max(f1[v[k]][], f1[v[k]][]);
f1[now][] += f1[v[k]][];
}
k = next[k];
}
return;
} void makeans_ban(int now, int fa)
{
int k = p[now];
if (now == ban)
{
f2[now][] = power[now];
while (k != -)
{
if ((k^) != fa && v[k] != root)
{
makeans_ban(v[k], k);
f2[now][] += max(f2[v[k]][], f2[v[k]][]);
f2[now][] += f2[v[k]][];
}
k = next[k];
}
return;
}
f2[now][] = power[now];
while (k != -)
{
if ((k^) != fa && k != cannot)
{
makeans_ban(v[k], k);
f2[now][] += max(f2[v[k]][], f2[v[k]][]);
f2[now][] += f2[v[k]][];
}
k = next[k];
}
return;
} int main()
{
scanf("%d", &n);
for (int i = ; i <= n; ++i) p[i] = -;
for (int i = ; i <= n; ++i)
{
int x; scanf("%d%d", &power[i], &x);
addbian(x, i);
}
long long ans = ;
for (int i = ; i <= n; ++i)
if (!vis[i])
{
root = -; ban = -;
vis[i] = ; dfs(i, -);
makeans_root(root, -);
makeans_ban(root, -);
long long zans = ;
zans = max(f1[root][], zans);
zans = max(zans, f1[root][]);
zans = max(f2[root][], zans);
ans += zans;
}
printf("%lld\n", ans);
}
bzoj 1040 骑士的更多相关文章
- BZOJ 1040 骑士 基环树 树形DP
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1040 题目大意: Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫 ...
- 【树形dp】Bzoj 1040骑士
Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火 ...
- BZOJ 1040 骑士(环套树DP)
如果m=n-1,显然这就是一个经典的树形dp. 现在是m=n,这是一个环套树森林,破掉这个环后,就成了一个树,那么这条破开的边连接的两个顶点不能同时选择.我们可以对这两个点进行两次树形DP根不选的情况 ...
- [bzoj] 1040 骑士 || 基环外向树dp
原题 给出n个点n条边和每个点的点权,一条边的两个断点不能同时选择,问最大可以选多少. //图是一张基环外向树森林 是不是很像舞会啊- 就是多了一条边. 所以我们考虑一下对于一棵基环外向树,拆掉一条在 ...
- [BZOJ 1040] [ZJOI2008] 骑士 【基环+外向树DP】
题目链接:BZOJ - 1040 题目分析 这道题目的模型就是一个图,不一定联通,每个连通块的点数等于边数. 每个连通块都是一个基环+外向树.即树上增加了一条边. 如果是树,就可以直接树形DP了.然而 ...
- bzoj 1085骑士精神
bzoj 1085骑士精神 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士,且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2 ...
- BZOJ 1040: [ZJOI2008]骑士 基环加外向树
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1190 Solved: 465[Submit][Status] ...
- bzoj 1040: [ZJOI2008]骑士 環套樹DP
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1755 Solved: 690[Submit][Status] ...
- bzoj 1040: [ZJOI2008]骑士 树形dp
题目链接 1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3054 Solved: 1162[Submit][S ...
随机推荐
- 升级、备份红帽PaaS openshift 上的 wordpress
红帽提供了一个很稳定的PAAS服务平台:openshift!此博客即作为wordpress建在里面. 这里记录怎样升级与备份wordpress. 预备: 安装 openshift command li ...
- objective-c对NSArray的学习
转自:http://gekie.iteye.com/blog/1086256 NSARRAY简单的使用 定义数组,遍历数组: 1 2 3 4 5 6 7 8 NSArray *array; array ...
- VBA Excel 打印
1. 设置 页边距.打印区域 With .PageSetup .HeaderMargin = Application.CentimetersToPoints(0.5) .LeftMargin = Ap ...
- MySQL查询优化 (一)
以下的文章主要讲述的是MySQL查询优化的5个十分好用方法,熟悉SQL语句的人都清楚,如果要对一个任务进行操作的话,SQL语句可以有很多种相关写法,但是不同的写法查询的性能可能会有天壤之别. 本文列举 ...
- php执行效率相关的语句
一:字符替换: strtr > str_replace > preg_replace 注意: 1:一般用strtr函数的这种形式:string strtr ( string $str , ...
- SQLServer 之 char、varchar、nvarchar的区别
一.定义 1.char char是定长的,也就是当你输入的字符小于你指定的数目时,它会再后面补空值.当你输入的字符大于指定的数时,它会截取超出的字符. 例如:char(8),最多可输入4个汉字或者8个 ...
- 深入理解windows
阿猫翻译的,用作备忘 深入理解windows——session.window stations.desktops 翻译自:http://www.brianbondy.com/blog/id/100/ ...
- CCScale9Sprite的使用
#include "cocos-ext.h" USING_NS_CC_EXT; //框中需要显示的label CCLabelTTF *label = CCLableTTF::cre ...
- 自定义弧形的 tabBar
// // TabBarViewController.h // LittleLoveLive // // Created by YJ // // TabBarViewController.m // L ...
- 使用 Feedly RSS阅读器订阅技术大牛的博客
这几天一直都在自己看书,可是书上面的东西都比较落后一点,而且没有大牛博文上的东西讲的深入,可是来回跳转各位大牛的博客又非常的麻烦,有一些公众账号虽然也会推荐一些知识内容,可是你应该有过看到多个公众号发 ...