洛谷 P2656 采蘑菇 树形DP+缩点+坑点
题目链接 https://www.luogu.com.cn/problem/P2656
分析
这其实是个一眼题(bushi
发现如果没有那个恢复系数,缩个点就完了,有恢复系数呢?你发现这个恢复系数其实在DAG中没有用,因为走不回去不管怎么恢复都没啥用,所以对于走不回去的子图没有什么用,于是就想到了缩点,把每个强连通缩成一个点就完了,因为我能恢复的话肯定走的越多越好,所以就把每个强连通都榨干就完了,统计答案就dp一下,正好刚学的树形dp,所以大概思路就有了。
我们先通过tarjan跑出强连通分量(有向图),然后缩点,最后dp,转移方程也挺简单的,dp[i]表示以i为跟的子树,初始化为W[i]
\(dp[i]+=max(dp[v])\)我最开始想的版本
但是有一个问题,这么定义的话缩点前权值在边上,缩点后权值在点上,我起初的处理办法是将边权都压到边的终点,因为我只有走过这条边才能获得这个权值,乍一看是没啥问题,但是呢?的确如果从根开始dp不会有问题,但这道题是从某一不定的节点开始dp的,这样就会出问题。
比如这里,我t->s这条边的权值会被压到s点上,如果我从t开始dp,没问题,从s开始,明明没有走那条边,却加上了边权,WA。
解决这个问题很简单啊,就特判一下,同一个连通分量内的点把权值压在点上,另外的放在边上,dp方程改成
\(dp[i]+=max(dp[v]+E.val)\)
然后这个问题就解决了,这道题一开始Wa的主要原因还是点权边权的处理,当然也可能是没想太明白就开始打代码,导致出现问题,总结一下,以后要先想明白再写,想出来思路也不一定对
#include<iostream>
#include<cstdio>
using namespace std;
const int N=8e4+10,M=2e5+10;
struct Edge{
int fro,nxt,to,val;
double hui;
}e[M],E[M];
int Head[N],len;
void Ins(int a,int b,int c,double d){
e[++len].fro=a;e[len].to=b;e[len].nxt=Head[a];
Head[a]=len;e[len].val=c;e[len].hui=d;
}
inline int read(){
char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
int x=0;
while(ch<='9'&&ch>='0'){
x=x*10+ch-'0';
ch=getchar();
}
return x;
}
int dfn[N],low[N],belong[N],stk[N],top,scc_cnt,num;
void tarjan(int u){
dfn[u]=low[u]=++num;
stk[++top]=u;
for(int i=Head[u];i;i=e[i].nxt){
int v=e[i].to;
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}else if(!belong[v])low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]){
scc_cnt++;
while(1){
int x=stk[top--];
belong[x]=scc_cnt;
if(x==u)break;
}
}
}
int H[N],l,w[N];
void I(int a,int b,int c){
E[++l].to=b;E[l].nxt=H[a];H[a]=l;E[l].val=c;
}
int dp[N];
void dfs(int u){
if(dp[u])return;
dp[u]=w[u];
int now=0;
for(int x=H[u];x;x=E[x].nxt){
int v=E[x].to;
dfs(v);
now=max(now,dp[v]+E[x].val);
}
dp[u]+=now;
}
int main(){
int n,m;
n=read();m=read();
for(int i=1;i<=m;i++){
int a,b,c;double d;
a=read();b=read();c=read();cin>>d;
Ins(a,b,c,d);
}
int s=read();
tarjan(s);
for(int i=1;i<=m;i++){
int u=belong[e[i].fro],v=belong[e[i].to];
if(u!=v)I(u,v,e[i].val);
if(u==v){
int now=e[i].val;double f=e[i].hui;
while(now){
w[v]+=now;
now=(int)now*f;
}
}
}
dfs(belong[s]);
cout<<dp[belong[s]];
}
洛谷 P2656 采蘑菇 树形DP+缩点+坑点的更多相关文章
- 洛谷——P2656 采蘑菇
P2656 采蘑菇 题目描述 小胖和ZYR要去ESQMS森林采蘑菇. ESQMS森林间有N个小树丛,M条小径,每条小径都是单向的,连接两个小树丛,上面都有一定数量的蘑菇.小胖和ZYR经过某条小径一次, ...
- 洛谷—— P2656 采蘑菇
https://www.luogu.org/problem/show?pid=2656 题目描述 小胖和ZYR要去ESQMS森林采蘑菇. ESQMS森林间有N个小树丛,M条小径,每条小径都是单向的,连 ...
- C++ 洛谷 2014 选课 from_树形DP
洛谷 2014 选课 没学树形DP的,看一下. 首先要学会多叉树转二叉树. 树有很多种,二叉树是一种人人喜欢的数据结构,简单而且规则.但一般来说,树形动规的题目很少出现二叉树,因此将多叉树转成二叉树就 ...
- $loj10156/$洛谷$2016$ 战略游戏 树形$DP$
洛谷loj Desription Bob 喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的方法.现在他有个问题. 现在他有座古城堡,古城堡的路形成一棵树.他要在这棵树的节点上放置最少数 ...
- [洛谷P2016] 战略游戏 (树形dp)
战略游戏 题目描述 Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题. 他要建立一个古城堡,城堡中的路形成一棵树.他要在这棵树的结点上放置最少数目的士兵,使得 ...
- 洛谷P2607 [ZJOI2008]骑士(树形dp)
题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里, ...
- 洛谷$2014$ 选课 背包类树形$DP$
luogu Sol 阶段和状态都是树形DP板子题,这里只讲一下背包的部分(转移)叭 它其实是一个分组背包模型,具体理解如下: 对于一个结点x,它由它的子结点y转移而来 在子结点y为根的树中可以选不同数 ...
- 洛谷 P2607 [ZJOI2008]骑士 树形DP
题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各 界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里, ...
- 洛谷 P1270 “访问”美术馆(树形DP)
P1270 “访问”美术馆 题目描述 经过数月的精心准备,Peer Brelstet,一个出了名的盗画者,准备开始他的下一个行动.艺术馆的结构,每条走廊要么分叉为两条走廊,要么通向一个展览室.Peer ...
随机推荐
- webpack中打包拷贝静态文件CopyWebpackPlugin插件
copyWebpackPlugin: 作用:用于webpack打包时拷贝文件的插件包 安装:npm install copyWebpackPlugin@版本号 使用:// copy custom st ...
- 疫情期,如何用A/B测试快速迭代你的产品?
作者:友盟+数据科学家 杨玉莲.陆子骏 冠状病毒来袭牵动着每个人的心,但是病毒影响的不仅仅是我们的健康,也以极快的速度极深远地影响了整个移动互联网的发展.主流阵地原本在线下的需求,如医疗和生鲜电商,快 ...
- 7-40 jmu-python-统计成绩 (15 分)
输入一批学生成绩,计算平均成绩,并统计不及格学生人数. 输入格式: 每行输入一个数据,输入数据为负数结束输入 输出格式: 平均分=XX,不及格人数=XX,其中XX表示对应数据.如果没有学生数据,输出没 ...
- Java 集合、数组排序
在平时开发的过程中,经常会遇到需要对数组.集合中元素按规则进行排序,本文记录在开发过程中可能遇到的情况以及相关的完整代码示例. 知识点 Comparable<T>接口 实现了该接口的对象, ...
- 关于javascript 的reduce方法
作为一个前端菜鸟,觉得资料比较好,特地分享一下~~ reduce() 方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值. 你一定也和我一样看的有点 ...
- 7,MapReduce基础
目录 MapReduce基础 一.关于MapReduce 二.MapReduce的优缺点 三.MapReduce的执行流程 四.编写MapReduce程序 五.MapReduce的主要执行流程 Map ...
- Fortify Audit Workbench 笔记 Header Manipulation
Header Manipulation Abstract HTTP 响应头文件中包含未验证的数据会引发 cache-poisoning. cross-site scripting. cross-use ...
- 初识JVM:(二)Java的垃圾回收机制详解
声明:本文主要参考https://www.cnblogs.com/codeobj/p/12021041.html 仅供个人学习.研究之用,请勿用于商业用途,如涉及侵权,请及时反馈,立刻删除. 一.Ja ...
- 干货来啦。Flask框架看这一篇就够了,关注不迷路,Jeff带你看源码。开发技术时时更新
目录 一.初识Flask 1.1 什么是flask? 1.2 为什么要有flask? 二.Flask快速启动 三.Flask四剑客 三.flask的配置文件 可以配置的属性 四.flask路由 4.1 ...
- PDIUSBD12指令
PDIUSBD12指令 端点描述 PDIUSBD12的端点适用于不同类型的设备,端点可通过[Set mode]命令配置为4种不同的模式,分别为: 模式0(NON-ISO模式):非同步模式 模式1(IS ...