这题真不爽,各种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. 转自邓凡平 《深入理解Android:Wi-Fi,NFC和GPS》章节连载[节选]--第七章 深入理解Wi-Fi P2P部分节选

    本章主要内容: 介绍Wi-Fi P2P相关知识: 介绍Android中WifiP2pService.wpa_supplicant的相关代码. 7.1  概述 承接第6章介绍的WSC,本章将继续介绍Wi ...

  2. 【转】VIM 快速注释

    我是用自己自定义的,跟你分享一下吧.希望能帮到你. 在.vimrc中加入下面的语句:vmap <C-S-P>    dO#endif<Esc>PO#if 0<Esc> ...

  3. Android文件选择器的实例分享

    本文给大家讲解下Android文件选择器的使用.实际上就是获取用户在SD卡中选择的文件或文件夹的路径,这很像C#中的OpenFileDialog控件. 此实例的实现过程很简单,这样可以让大家快速的熟悉 ...

  4. 【每日一摩斯】-Index Skip Scan Feature (212391.1)

    INDEX Skip Scan,也就是索引快速扫描,一般是指谓词中不带复合索引第一列,但扫描索引块要快于扫描表的数据块,此时CBO会选择INDEX SS的方式. 官方讲的,这个概念也好理解,如果将复合 ...

  5. Mac OS X 10.10 Yosemite下安装java、jdk、mysql、maven、idea

    Mac OS X Yosemite已经在2014年10月17日正式发布了. 作为一个java开发者,尝鲜第一时间安装了最新版本. 和之前的OS X系统还是有很多不同的.下面主要在java开发环境方面做 ...

  6. _vsnprintf 用法

    _vsnprintf,C语言库函数之一,属于可变参数.用于向字符串中打印数据.数据格式用户自定义. 头文件: #include <stdarg.h> 函数声明: int _vsnprint ...

  7. Playing with ptrace, Part II

    Playing with ptrace, Part II Issue From Issue # December Dec , By Pradeep Padala inSysAdmin In Part ...

  8. VirtualBox命令更改虚拟硬盘空间

    主要是使用VBoxManage命令来操作 第一步:打开CMD,进入到virtualbox存放虚拟机的目录中(win7 系统可以直接在文件夹空白处按住shift键右键鼠标选择[在此处打开命令窗口]),输 ...

  9. 升级时出现:请先升级 UCenter 到 1.6.0 以上版本。

    有的站点UCenter升级完成后仍然提示请先升级 UCenter 到 1.6.0 以上版本的现象,下面分享下UCenter版本号不正确的原因和处理办法,可能有以下的几个文件和处理办法: 一.UCent ...

  10. tomcat 详解五 tomcat页面设置访问权限

    转自:http://blog.knowsky.com/191233.htm 在web应用中,对页面的访问控制通常通过程序来控制,流程为:登录 -> 设置session -> 访问受限页面时 ...