这题真不爽,各种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 骑士的更多相关文章

  1. BZOJ 1040 骑士 基环树 树形DP

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1040 题目大意: Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫 ...

  2. 【树形dp】Bzoj 1040骑士

    Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火 ...

  3. BZOJ 1040 骑士(环套树DP)

    如果m=n-1,显然这就是一个经典的树形dp. 现在是m=n,这是一个环套树森林,破掉这个环后,就成了一个树,那么这条破开的边连接的两个顶点不能同时选择.我们可以对这两个点进行两次树形DP根不选的情况 ...

  4. [bzoj] 1040 骑士 || 基环外向树dp

    原题 给出n个点n条边和每个点的点权,一条边的两个断点不能同时选择,问最大可以选多少. //图是一张基环外向树森林 是不是很像舞会啊- 就是多了一条边. 所以我们考虑一下对于一棵基环外向树,拆掉一条在 ...

  5. [BZOJ 1040] [ZJOI2008] 骑士 【基环+外向树DP】

    题目链接:BZOJ - 1040 题目分析 这道题目的模型就是一个图,不一定联通,每个连通块的点数等于边数. 每个连通块都是一个基环+外向树.即树上增加了一条边. 如果是树,就可以直接树形DP了.然而 ...

  6. bzoj 1085骑士精神

    bzoj 1085骑士精神 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士,且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2 ...

  7. BZOJ 1040: [ZJOI2008]骑士 基环加外向树

    1040: [ZJOI2008]骑士 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1190  Solved: 465[Submit][Status] ...

  8. bzoj 1040: [ZJOI2008]骑士 環套樹DP

    1040: [ZJOI2008]骑士 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1755  Solved: 690[Submit][Status] ...

  9. bzoj 1040: [ZJOI2008]骑士 树形dp

    题目链接 1040: [ZJOI2008]骑士 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3054  Solved: 1162[Submit][S ...

随机推荐

  1. 解决使用DevExpress开发错误:未将对象引用设置到对象的实例

    在使用DevExpress是总是会出现一些状况.这次同事在他的机器上调试完成的代码发过来,却出现"未将对象引用设置到对象的实例"的错误,提示是Resources.resx的问题.另 ...

  2. some websit

    Baidu:VideoView onVideoSizeChanged http://code.taobao.org/p/TangHuZhao/src/ http://code.taobao.org/p ...

  3. [Ramda] Compose and Curry

    Curry: The idea of Curry is to spreate the data from the function. Using Curry to define the functio ...

  4. iOS开发——数据持久化&使用NSUserDefaults来进行本地数据存储

    使用NSUserDefaults来进行本地数据存储   NSUserDefaults适合存储轻量级的本地客户端数据,比如记住密码功能,要保存一个系统的用户名.密码.使用NSUserDefaults是首 ...

  5. PXC的原理

    http://www.blogs8.cn/posts/AWif6E4 mariadb的集群也是抄percona的,原理跟PXC一样maridb-cluster就是PXC,原理是一样的.codeship ...

  6. 01 MySQL锁概述

    锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O 等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有 ...

  7. visual studio 2013 c++ 打开code map 功能

    属性->c++ -> Browse Infomation -> Enable Browse Infomation设为true http://msdn.microsoft.com/li ...

  8. C. Guess Your Way Out!

    C. Guess Your Way Out!                                                               time limit per ...

  9. Miaomiao's Geometry

    HDU 4932  Bestcoder Problem Description There are N point on X-axis . Miaomiao would like to cover t ...

  10. Nodejs的mysql模块学习(一)

    介绍 mysql npm包 是一个nodejs的模块,由JavaScript编写 安装 npm install mysql 建立连接 var mysql = require('mysql');//引用 ...