【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=1040

【题目大意】

  给出环套外向树森林,求最大权独立集。

【题解】

  我们对于每个连通块,找到环上的一条边拆开,对于边的两端分别做树形DP,
  假设两端点位x和y,那么不包含x的dp值涵盖了是否包含y两种情况,
  同理,以y为根的也是,因为边的两端不能同时取到,因此对于两者取最大值即可。
  代码中f[x]表示包含x的dp值,g[x]表示不包含x的dp值。

【代码】

#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long LL;
const int N=1000010;
vector<int> v[N],id[N];
LL g[N],f[N],ans;
int ban,n,c[N],x,vis[N],root,_root,idn=0;
void dfs(int x,int fx){
vis[x]=1;
for(int i=0;i<v[x].size();i++){
int y=v[x][i];
if(y==fx)continue;
if(!vis[y])dfs(y,x);
else{root=y;_root=x;ban=id[x][i];}
}
}
void TreeDP(int x,int fx){
f[x]=c[x],g[x]=0;
for(int i=0;i<v[x].size();i++){
int y=v[x][i];
if(y==fx)continue;
if(id[x][i]==ban||id[x][i]==(ban^1))continue;
TreeDP(y,x);
f[x]+=g[y]; g[x]+=max(f[y],g[y]);
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&c[i],&x);
v[x].push_back(i);
id[x].push_back(idn++);
v[i].push_back(x);
id[i].push_back(idn++);
}
for(int i=1;i<=n;i++){
if(!vis[i]){
dfs(i,-1);
TreeDP(root,-1);
LL tmp=g[root];
TreeDP(_root,-1);
tmp=max(tmp,g[_root]);
ans+=tmp;
}
}printf("%lld\n",ans);
return 0;
}

BZOJ 1040:[ZJOI2008]骑士(环套外向树+树形DP)的更多相关文章

  1. bzoj 1040: [ZJOI2008]骑士【基环树+树形dp】

    没考虑可以连着两个不选--直接染色了 实际上是基环森林,对于每棵基环树,dfs找出一个环边,然后断掉这条边,分别对这条边的两端点做一边treedp,取max加进答案里 treedp是设f[u]为选u点 ...

  2. BZOJ 1040: [ZJOI2008]骑士(基环树dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1040 题意: 思路: 这是基环树,因为每个人只会有一个厌恶的人,所以每个节点只会有一个父亲节点,但是 ...

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

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

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

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

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

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

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

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

  7. [BZOJ 1040][ZJOI2008]骑士

    1040: [ZJOI2008]骑士 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5403  Solved: 2060[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]骑士 题解

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

随机推荐

  1. python学习笔记(四)之分支和循环

    python中比较操作符有: > >= < <= == != 这些操作符返回True或False 1 >>> 1 < 3 2 True 3 >&g ...

  2. 小程序var that=this

    小程序的js函数中,一般第一句就是var that=this,那么此语句的必要性是什么呢?下面用一段代码来解释这个问题 Page({ //页面的初始数据 loadUsers: function () ...

  3. xgboost/gbdt在调参时为什么树的深度很少就能达到很高的精度?

    问题: 用xgboost/gbdt在在调参的时候把树的最大深度调成6就有很高的精度了.但是用DecisionTree/RandomForest的时候需要把树的深度调到15或更高.用RandomFore ...

  4. 【Python学习笔记】colormap的参数及其对应的色条

  5. 打印 pmic register value

    打印 PMIC register value 方式有二種, 一種是使用 adb shell cat pmic register 一種是直接在 code 裡 call dump pmic registe ...

  6. 【Android XML】Android XML 转 Java Code 系列之 介绍(1)

    最近在公司做一个项目,需要把Android界面打包进jar包给客户使用.对绝大部分开发者来说,Android界面的布局以XML文件为主,并辅以少量Java代码进行动态调整.而打包进jar包的代码,意味 ...

  7. 【Android开发日记】之入门篇(十五)——ViewPager+自定义无限ViewPager

    ViewPager 在 Android 控件中,ViewPager 一直算是使用率比较高的控件,包括首页的banner,tab页的切换都能见到ViewPager的身影. viewpager 来源自 v ...

  8. python 基础 习题

    1.执行 Python 脚本的两种方式2.简述位.字节的关系 1Byte = 8bits 3.简述 ascii.unicode.utf-8.gbk 的关系 都是字符集,unicode兼容其他3种字符集 ...

  9. linux命令(47):rmdir命令

    1.命令格式: rmdir [选项]... 目录... 2.命令功能: 该命令从一个目录中删除一个或多个子目录项,删除某目录时也必须具有对父目录的写权限. 3.命令参数: - p 递归删除目录dirn ...

  10. 利用getBoundingClientRect()来实现div容器滚动固定

    ele.getBoundingClientRect()的方法是可以获得一个元素在整个视图窗口的位置 可以return的值有width,height,top,left,x,y,right,bottom ...