题意:n个点,每个点有一个faith值,然后有一个关联的点。如果在i点和它的关联点pi同时修

神庙则得到的faith值变为fi+gi,如果只在i点修不在pi修建,则得到的faith值为fi。问最优修建方案

中能获得的faith值即求能获得的最大faith值。

算法:

由于有n个点和n条边,所以一定是一个带环的图,环外有小尾巴。

对于环外的点,利用dp[i][0]+=max(dp[soni][0],dp[soni][1])和dp[i][1]+=max(dp[soni][0],dp[soni][1]+g[son])

不断向上缩点。

对于每个环,则枚举其中一个点的状态,之后就成了一条链,又可以运用上面的方程。

这个选与不选问题的dp方程是树形dp里比较基本的类型。如poj 2342 Anniversary party

  POJ 1463 && HDU 1054 Strategic Game

这题比较新颖在于图中环的处理,枚举环中一个点来使环变为链。

我没想出这个枚举的方法,参考了下面的blog。

http://blog.csdn.net/ahero_happy/article/details/6728471

#include<cstdio>
#include<iostream>
#include<cstring>
#define ll long long
#define maxn 100010using namespace std;int in[maxn],q[maxn],p[maxn],f[maxn],g[maxn];
ll dp[maxn][2],dp1[maxn][2];
bool vis[maxn];ll maxx(ll a,ll b)
{return a>b?a:b;
}ll dfs1(int st,int cur,ll dp[][2],int flag)
{int k=cur;int i=p[k];while(i!=st){dp[i][0]+=maxx(dp[k][0],dp[k][1]);dp[i][1]+=maxx(dp[k][0],dp[k][1]+g[k]);k=i;i=p[k];}if(flag) dp[k][1]+=g[k];return  maxx(dp[k][0],dp[k][1]);
}ll dfs(int now)
{int k=now;int i=p[k];dp1[i][0]+=dp[k][0];dp1[i][1]+=dp[k][0];//now不取ll a1=dfs1(k,i,dp1,0);dp[i][0]+=dp[k][1];dp[i][1]+=dp[k][1]+g[k];//now取ll a2=dfs1(k,i,dp,1);return maxx(a1,a2);
}int main()
{int n,rear;ll sum;while(scanf("%d",&n)!=EOF){memset(in,0,sizeof(in));memset(vis,0,sizeof(vis));memset(dp,0,sizeof(dp));for(int i=1;i<=n;i++){scanf("%d%d%d",&f[i],&g[i],&p[i]);in[p[i]]++;}rear=0;for(int i=1;i<=n;i++){dp[i][1]=f[i];if(!in[i])q[rear++]=i;}while(rear){int k = q[--rear];vis[k] = true;int i = p[k];dp[i][0]+=maxx(dp[k][0],dp[k][1]);dp[i][1]+=maxx(dp[k][0],dp[k][1]+g[k]);if((--in[i])==0)q[rear++]=i;}memcpy(dp1,dp,sizeof(dp));sum=0;for(int i=1;i<=n;i++){if(!vis[i]){sum+=dfs(i);vis[i]=true;for(int j=p[i];j!=i;j=p[j])vis[j]=true;}}printf("%lld\n",sum);}return 0;
}

zoj 3527 Shinryaku! Kero Musume (树形dp---带尾巴的环的处理)相关推荐

  1. LibreOJ #2478.「九省联考 2018」林克卡特树 树形dp+带权二分

    题意 给出一棵n个节点的树和k,边有边权,要求先从树中选k条边,然后把这k条边删掉,再加入k条边权为0的边,满足操作完后的图仍然是一棵树.问新树的带权直径最大是多少. n,k≤3∗105n,k≤3∗1 ...

  2. 洛谷.4383.[八省联考2018]林克卡特树lct(树形DP 带权二分)

    题目链接 \(Description\) 给定一棵边带权的树.求删掉K条边.再连上K条权为0的边后,新树的最大直径. \(n,K\leq3\times10^5\). \(Solution\) 题目可以 ...

  3. BZOJ 1827: [Usaco2010 Mar]gather 奶牛大集会 树形DP + 带权重心

    Description Bessie正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会.当然,她会选择最方便的地点来举办这次集会.每个奶牛居住在 N(1<=N<=100,0 ...

  4. BZOJ 2878: [Noi2012]迷失游乐园( 树形dp )

    一棵树的话直接树形dp(求出往下走和往上走的期望长度). 假如是环套树, 环上的每棵树自己做一遍树形dp, 然后暴力枚举(环上的点<=20)环上每个点跑经过环上的路径就OK了. -------- ...

  5. #基环树,树形dp#洛谷 2607 JZOJ 1723 骑士

    题目 有环的没有上司的舞会 分析 那么有环那就不是树形dp了,如何处理环,可以先连起来,树形dp,再把环断掉,再跑一次树形dp,两次的最大值即为答案 代码 #include <cstdio> ...

  6. 树形DP zoj 3527

    题目地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3527 /*以前做过一道类似的题目,但是这次看到 因为的失误没有看 ...

  7. ZOJ 3527 树形DP(章鱼图DP)

    题意 有N个村庄,每个村庄有一定的信仰值,占领村庄可以得到信仰值,每个村庄有一个关联村庄,同时占领关联村庄可以得到加成(可能为负),问占领一些村庄,最多可以得到多少信仰值 题解 这个DP已经不能算是树 ...

  8. 树形dp ---- 2018年杭电多校第二场 H travel

    题目大意: 就是给你一个带点权的树,找到3条独立互不相交的路径使得权值和最大 解题思路: 很经典的树形dp 我们设dp[root][j][k]dp[root][j][k]dp[root][j][k]表 ...

  9. 【学时总结】◆学时·VIII◆ 树形DP

    ◆学时·VIII◆ 树形DP DP像猴子一样爬上了树--QwQ ◇ 算法概述 基于树的模型,由于树上没有环,满足DP的无后效性,可以充分发挥其强大统计以及计算答案的能力. 一般来说树形DP的状态定义有 ...

  10. [WC2018]通道——边分治+虚树+树形DP

    题目链接: [WC2018]通道 题目大意:给出三棵n个节点结构不同的树,边有边权,要求找出一个点对(a,b)使三棵树上这两点的路径权值和最大,一条路径权值为路径上所有边的边权和. 我们按照部分分逐个 ...

最新文章

  1. MySQL介绍与语言结构
  2. 插值算法C实现(二元全区间)
  3. 《架构漫谈》阅读笔记
  4. 课时 17-深入理解 etcd:etcd 性能优化实践(陈星宇)
  5. docker yum php mysql_Centos下 使用Docker, 配置PHP+Nginx+Mysql(多PHP版本)
  6. 2009计算机网络考研大题,2009年计算机考研统考真题网络部分分析
  7. 【渝粤教育】国家开放大学2018年春季 0689-22T老年心理健康 参考试题
  8. 【 CodeForces - 864B】Polycarp and Letters(水题,字符串,有坑)
  9. 怎样获取linux命令帮助?
  10. 功能区不显示工具条_【新老客户必知】软件支持超高清屏显示器了
  11. 7-2 查找指定字符 (15 分)
  12. [编织消息框架][JAVA核心技术]异常基础
  13. 软考初级程序员主要考什么?如何复习?
  14. 软件设计师-8.算法分析与设计
  15. 快速排序时间复杂度数学证明
  16. 用Python自制一个百度一下,这操作可还行
  17. JGIT使用的常见问题
  18. 不同数据类型混合运算及类型转换
  19. Android开发——实现数字时钟
  20. 谈谈promise,谈谈微任务

热门文章

  1. [转]我在上海的五年奋斗岁月
  2. draw.io箭头设置虚线
  3. Python学习 Task01 :变量,运算符,与数据类型
  4. 计算机音乐我还是曾经那个少年,我还是从前那个少年是什么歌
  5. 数学专业英语 -- 期望、方差、中心极限定理
  6. PS中怎么将模糊图片变的清晰一点
  7. grub4dos挂载iso linux,GRUB4DOS加载ISO启动光盘完美解决方案
  8. 使用Word批量删除换行和空白行
  9. 微信公众号怎么发送模板消息 微信公众平台模板消息免费发送的技巧
  10. 【硬见小百科】数字电子时钟电路图设计原理