【题目链接】

http://www.lydsy.com/JudgeOnline/problem.php?id=1040

【题意】

给一个基环森林,每个点有一个权值,求一个点集使得点集中的点无边相连且权值和最大。

【思路】

注意题目中的有向边其实就是无向边。然后有多个联通块,每个联通块中有且仅有一个环。

如果没有环的话可以用树形DP,解决这个问题。

设f[i][0],f[i][1]分别表示以i为根,不选/选i时的最大权值。则有转移式:

f[i][0]=sigma{ max(f[son(i)][0],f[son(i)][1]) }

f[i][1]=sigma{ f[son(i)][0] }

对于一个环,我们任选一条边拆开,然后以边的两点U,V为根做树形DP,再考虑边UV存在,有两种情况:

  1) 强制不选U,V任意,环的贡献为以U做DP的f[U][0]

  2) 强制不选V,U任意,环的贡献为以V做DP的f[V][0]

【科普】

基环外向树就是一棵树加一条边(好厉害的名字<_<

【代码】

 #include<cstdio>
#include<cstring>
#include<iostream>
#define FOR(a,b,c) for(int a=(b);a<=(c);a++)
using namespace std; typedef long long ll;
const int N = 1e6+; struct Edge {
int v,nxt;
}e[N<<];
int en=,front[N];
void adde(int u,int v)
{
en++; e[en].v=v,e[en].nxt=front[u],front[u]=en;
} int n,w[N],vis[N];
ll f[N][]; ll read()
{
char c=getchar(); ll f=,x=;
while(!isdigit(c)) {if(c=='-') f=-; c=getchar(); };
while(isdigit(c)) x=x*+c-'',c=getchar();
return x*f;
} int U,V,E;
void dfs(int u,int fa)
{
vis[u]=;
for(int i=front[u];i;i=e[i].nxt) {
if((i^)==fa) continue;
int v=e[i].v;
if(vis[v]) {
U=u; V=v; E=i;
continue;
}
dfs(v,i);
}
}
void treedp(int u,int fa,int ban)
{
f[u][]=w[u],f[u][]=;
for(int i=front[u];i;i=e[i].nxt) {
if((i^)==fa) continue;
if(i==ban||(i^)==ban) continue;
int v=e[i].v;
treedp(v,i,ban);
f[u][]+=max(f[v][],f[v][]);
f[u][]+=f[v][];
}
} int main()
{
n=read();
int v;
FOR(i,,n) {
w[i]=read(),v=read();
adde(i,v),adde(v,i);
}
ll ans=;
FOR(i,,n) if(!vis[i]) {
dfs(i,-);
treedp(U,-,E);
ll tmp=f[U][];
treedp(V,-,E);
tmp=max(tmp,f[V][]);
ans+=tmp;
}
printf("%lld",ans);
return ;
}

bzoj 1040 [ZJOI2008]骑士(基环外向树,树形DP)的更多相关文章

  1. 1040: [ZJOI2008]骑士~基环外向树dp

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

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

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

  3. BZOJ 1040 [ZJOI2008]骑士 (基环树+树形DP)

    <题目链接> 题目大意: Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的 ...

  4. BZOJ 1040: [ZJOI2008]骑士 [DP 环套树]

    传送门 题意:环套树的最大权独立集 一开始想处理出外向树树形$DP$然后找到环再做个环形$DP$ 然后看了看别人的题解其实只要断开环做两遍树形$DP$就行了...有道理! 注意不连通 然后洛谷时限再次 ...

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

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

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

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

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

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

  8. BZOJ1040 骑士 基环外向树

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

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

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

随机推荐

  1. 一个 XSD 实例

    一个 XSD 实例 本节会为您演示如何编写一个 XML Schema.您还将学习到编写 schema 的不同方法. XML 文档 让我们看看这个名为 "shiporder.xml" ...

  2. Windows 2008 R2系统开机时如何不让Windows进行磁盘检测?

    开始→运行,在运行对话框中键入“chkntfs /t:0”,即可将磁盘扫描等待时间设置为0, 如果要在计算机启动时忽略扫描某个分区,比如C盘,可以输入“chkntfs /x c:”命令:如果要恢复对C ...

  3. 搭建 Android 开发环境,初试HelloWorld (win7) (下) (转)

    5. 创建AVD 为使Android应用程序可以在模拟器上运行,必须创建AVD. 在Eclipse菜单中,选择  Windows -> Android Virtual Device Manage ...

  4. python List&Set&Dict交集、并集、差集

    1.python List交集.并集.差集 1). 获取两个list 的交集#方法一: a=[2,3,4,5] b=[2,5,8] tmp = [val for val in a if val in  ...

  5. 1990-D. 幻方

    描述 河图,黑点白点排列奥秘数阵:洛书,纵横斜三条线上数和皆15.这是一个古老的数字游戏,将1~9填入一个九宫格,使得每行.每列.对角线上数字的和都相同(为15).在西方,满足类似规律的矩阵称之为幻方 ...

  6. UR #13 Yist

    第一次打UR,打了一个半小时就弃疗了QAQ 这是我唯一一道考试的时候做出来的题目,其他两道连暴力都懒得写了 很容易发现对于每个要删除的点 我们找到左边第一个比他小的不用删除的点,右边第一个比他小的不用 ...

  7. SPRING IN ACTION 第4版笔记-第八章Advanced Spring MVC-007-给flowl加权限控制<secured>

    States, transitions, and entire flows can be secured in Spring Web Flow by using the <secured> ...

  8. windows 下 文件属性及目录列表操作

    转:http://blog.sina.com.cn/s/blog_686d0fb001012tsg.html 我们需要一个结构体和几个函数.这些函数和结构体在<io.h>的头文件中,结构体 ...

  9. Android 解析XML

    public void getXML(String url) throws XmlPullParserException,IOException,URISyntaxException { String ...

  10. #error作用与举例

    2013-09-05 14:32:17   #error命令是C/C++语言的预处理命令之一,当预处理器预处理到#error命令时将停止编译并输出用户自定义的错误消息.   语法: #error [用 ...