这题真不爽,各种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. [AngularJS] ui-router: Abstract States

    ui-router has the powerful ability to define abstract states, or states that can't be navigated to, ...

  2. 开发者必备,超实用的PHP代码片段(转)

    此前,研发频道曾发布<直接拿来用,10个PHP代码片段>,得到了网友们的一致好评.本文,笔者将继续分享九个超级有用的PHP代码片段.当你在开发网站.应用或者博客时,利用这些代码能为你节省大 ...

  3. 【ZZ】如何选择适合自己项目的编程语言

    http://news.cnblogs.com/n/506473/ 与操作系统一样,在办公室软件套装和计算机中也具有各种计算机语言.存在这种多样性的原因与其它地方的多样性一样—-因为没有单一的解决方法 ...

  4. oracle procedure存储过程(pl/sql)_使用declare cursor_begin end嵌套

    create or replace procedure PRO_DelArticles ( ArticleId in varchar2 ) is ArticleNum varchar2(20); sq ...

  5. PHP.2-LAMP平台介绍及网站的工作原理

    LAMP平台介绍及网站的工作原理 1.HTTP协议 URL(UniformResourceLocator)统一资源定位符,就是网页地址的意思.[格式:协议://主机.端口.文件.附加资源] ##URL ...

  6. BootStrap2学习日记1--网格系统

    在BoootStrap2的版本中采用的布局方式是12栏网格布局(把浏览器的Width分12栏,布局中使用每个元素所占格数的不同来达到各种布局),包括(固定)网格布局(Grid System)和流式网格 ...

  7. C# 之 Stream 和 byte[] 的相关转换

    1.二进制转换为图片 MemoryStream ms = new MemoryStream(bytes); ms.Position = ; Image img = Image.FromStream(m ...

  8. javaEE学习笔记-利用DOM4J解析xml至数据库

    xml代码文件名:test02.xml <ACCESOS> <item> <SOCIO> <NUMERO>00045050</NUMERO> ...

  9. ConcurrentHashMap 源码解析 -- Java 容器

    ConcurrentHashMap的整个结构是一个Segment数组,每个数组由单独的一个锁组成,Segment继承了ReentrantLock. 然后每个Segment中的结构又是类似于HashTa ...

  10. python multiprocess不能完全关闭socket的验证

    近日项目有原来的多线程升级成为多进程模型后,但出现了个问题,在持续运行一天左右系统处理能力开始变慢,并不时打印以下信息: too many opened files 修改ulimit中open fil ...