洛谷 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 ...
随机推荐
- P1097 统计数字
P1097题库链接:https://www.luogu.org/problem/P1097 难度:普及- 算法标签:模拟,排序,概率论 1.桶模拟 O(n) 得分20 由于题目让统计数出现的次数,并按 ...
- 记一次苹果APP从账号续费到发布成功的历程
一.一波三折的续费 最近公司开发的苹果APP的SSL证书到期了,计划重新发布一下该APP,已替换即将到期的SSL证书.近几年随着钉钉.企业微信等在线办公软件超级平台的出现,各企业都会选择其中 ...
- JavaScript(5)--- 面向对象 + 原型
面向对象 + 原型 面向对象这个概念并不陌生,如 C++.Java 都是面向对象语言.面向对象而言都会现有一个类的概念 ,先有类再有对象.类是实例的类型模板. 比如人类 是一个类 张三 李四 就是一个 ...
- 微信Android自动播放视频(可交互,设置层级,无控制条,非X5)ffmpeg,jsmpeg.js,.ts视频
原料: ffmpeg : http://ffmpeg.zeranoe.com/builds/ win64 https://evermeet.cx/ffmpeg/ mac OS X 64 jsmp ...
- 微信h5页面调用第三方位置导航
微信h5页面拉起第三方导航应用 需要准备的: 通过微信认证的公众号有备案过的域名 背景:微信公众号点击菜单栏跳到h5页面,需要用到导航功能 需求:当用户点击导航按钮时,跳转到第三方app进行导航 参考 ...
- nodejs通过响应回写的方式渲染页面资源
我们一般通过node框架提供的api操作页面渲染,如何利用原始回写的方式来实现同样的功能呢下面是通过node 提供的异步地读取一个文件的全部内容api readFile进行操作,代码如下: html ...
- 自己查与写的批量比较bash
前言:互测的时候一个一个输入感觉太麻烦,于是尝试写自己的对拍,又想到os刚学了bash命令行处理,于是想把两者结合一下减轻自己的工作量 分两步: 将所有人的工程导出成jar文件 放到linux下用ba ...
- IIS6.0文件解析漏洞和短文件名漏洞复现
一.IIS6.0文件解析漏洞 1.ASP一句话木马的准备 新建木马文件“muma.txt”,将“我asp是一句话木马:<%eval request("asp")%>”写 ...
- mongoose .find().limit()返回undefined
当我们使用mongoose的find方法查询数据库的同时,可以使用limit方法来指定返回数据的条数. limit方法基本语法如下所示: >db.COLLECTION_NAME.find().l ...
- 全面认识HBase架构(建议收藏)
在网上看过很多HBaes架构相关的文章,内容深浅不一,直到发现了一篇MapR官网的文章https://mapr.com/blog/in-depth-look-hbase-architecture/#. ...