原题链接

题意:给你一个有向图,一共N个顶点,且每个顶点只有一个前驱或后继,在顶点上建立圣地,那么就可以获得一个信仰值,如果在这个顶点的后继节点上也建立圣地,那么将改变一定的信仰值,求解能获取的最大信仰值。

分析:比赛时一点思路也没有。然后看啦一下别人博客,发现也不是太难,要注意一个关键点,这个有向图的所有子图均为点数等于边数的简单图。由此可以推出每个子图有且仅有一个环。环上可能有一些树枝。用拓扑定理和树形DP先处理树枝。然后在处理每个环。对于环,从环上任意一点开始,分在这一点建圣庙,和不建。树形DP处理。

这里附上代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int INF=0x3f3f3f3f;
typedef long long ll;
ll dp[100100][2],dp1[100100][2],p[100100],g[100100];
int f[100100],n,in[100100],t[100100],n2;
bool vis[100100];
int main()
{while(scanf("%d",&n)!=EOF){memset(in,0,sizeof(in));memset(vis,false,sizeof(vis));for(int i=1;i<=n;i++){scanf("%lld%lld%d",&p[i],&g[i],&f[i]);in[f[i]]++;}queue<int> que;for(int i=1;i<=n;i++){dp[i][1]=p[i];dp[i][0]=0;if(in[i]==0){que.push(i);}}while(!que.empty()){int from=que.front();que.pop();int to=f[from];in[to]--;if(in[to]==0){que.push(to);}dp[to][1]+=max(dp[from][0],dp[from][1]+g[from]);dp[to][0]+=max(dp[from][0],dp[from][1]);vis[from]=true;}ll ans=0;for(int i=1;i<=n;i++){if(vis[i])continue;int from=i;t[1]=i;n2=1;vis[from]=true;while(f[from]!=i){//  cout<<from<<"--->";from=f[from];vis[from]=true;t[++n2]=from;}//cout<<endl;memcpy(dp1,dp,sizeof(dp));dp[t[2]][1]+=(dp[t[1]][1]+g[t[1]]);dp[t[2]][0]+=dp[t[1]][1];for(int j=3;j<=n2;j++){dp[t[j]][1]+=max(dp[t[j-1]][0],dp[t[j-1]][1]+g[t[j-1]]);dp[t[j]][0]+=max(dp[t[j-1]][0],dp[t[j-1]][1]);}dp1[t[2]][1]+=(dp1[t[1]][0]);dp1[t[2]][0]+=(dp1[t[1]][0]);for(int j=3;j<=n2;j++){dp1[t[j]][1]+=max(dp1[t[j-1]][0],dp1[t[j-1]][1]+g[t[j-1]]);dp1[t[j]][0]+=max(dp1[t[j-1]][0],dp1[t[j-1]][1]);}int to=t[n2];ans+=max(max(dp[to][1]+g[to],dp[to][0]),max(dp1[to][1],dp1[to][0]));//  cout<<ans<<endl;}printf("%lld\n",ans);}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. 树形DP(简单题)(Y HDU4705)

    题意:给出一个n个节点的树形图,统计{A,B,C}的数量,其中ABC分别是树上三个不同的节点,并且这三个节点不能被一条路径覆盖 分析:对于下图 进行dfs深搜统计,num[u]统计回溯到当前节点u,并 ...

  5. CEOI2017Chase追逐——树形DP

    LOJ题目传送门 题目描述 在逃亡者的面前有一个迷宫,这个迷宫由 n个房间和 n−1 条双向走廊构成,每条走廊会链接不同的两个房间,所有的房间都可以通过走廊互相到达.换句话说,这是一棵树. 逃亡者会选 ...

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

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

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

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

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

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

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

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

  10. 2020CCPC(威海) - Rencontre(树形dp)

    题目大意:给出一棵带权树,规定 ,解释一下就是当确定三个点 u1 , u2 , u3 后,需要找到一个点 v 到三个点的距离之和最小,现在给出 u1 , u2 , u3 的可行取值,问 f 函数的期望 ...

最新文章

  1. 基于小波和插值的超分辨率图像重建算法
  2. Python(7):__init__.py
  3. Markdown 图标 快捷键
  4. PWN-PRACTICE-BUUCTF-19
  5. 【温故知新】——原生js中常用的四种循环方式
  6. tkinter显示mysql表_Python(Tkinter)如何只显示Mysql记录而不显示列表?
  7. 教师节送什么老师最开心?程序员三招解决家长送礼难题!
  8. WebService应用:音乐站图片上传
  9. oracle 自治事物,自治事务 - 努力创造未来! - BlogJava
  10. sql创建表主键gui_在SQL Server中使用主数据服务快速创建最终用户可以维护的GUI
  11. Vue.js 学习笔记 六 v-model 双向绑定数据
  12. hdu acm1157
  13. siege linux 压力测试工具
  14. 解除电脑宽带限制,提升电脑网速
  15. 线性充电IC和开关充电IC的区别
  16. 域名Whois查询API,域名Whois,域名历史Whois
  17. matlab上机作业,matlab上机作业(数字信号处理)
  18. 使用git push没有报错,但是远程仓库没有更新的问题
  19. B002 - 基于嵌入式的老人定位追踪监测仪
  20. [高数][高昆轮][高等数学上][第一章-函数与极限]02.数列的极限

热门文章

  1. uhs3内存卡有哪些_三分钟教你看懂存储卡标识
  2. Labview的CAN通讯
  3. SPSS中字符串转为数值后数据消失的解决办法
  4. java两个日期相减_java将两个日期相减得到天数
  5. 分析 2017年淘宝天猫活动时间安排
  6. iShare·AD小技巧--如何设置镂空的字体
  7. Java DataStore 封装代码
  8. Python 矩形积分法推荐采样点设置个数
  9. 在腾讯云开通短信验证服务并完成群发消息测试
  10. mac:通过鼠标右键 新建文本文档