题目链接 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+缩点+坑点的更多相关文章

  1. 洛谷——P2656 采蘑菇

    P2656 采蘑菇 题目描述 小胖和ZYR要去ESQMS森林采蘑菇. ESQMS森林间有N个小树丛,M条小径,每条小径都是单向的,连接两个小树丛,上面都有一定数量的蘑菇.小胖和ZYR经过某条小径一次, ...

  2. 洛谷—— P2656 采蘑菇

    https://www.luogu.org/problem/show?pid=2656 题目描述 小胖和ZYR要去ESQMS森林采蘑菇. ESQMS森林间有N个小树丛,M条小径,每条小径都是单向的,连 ...

  3. C++ 洛谷 2014 选课 from_树形DP

    洛谷 2014 选课 没学树形DP的,看一下. 首先要学会多叉树转二叉树. 树有很多种,二叉树是一种人人喜欢的数据结构,简单而且规则.但一般来说,树形动规的题目很少出现二叉树,因此将多叉树转成二叉树就 ...

  4. $loj10156/$洛谷$2016$ 战略游戏 树形$DP$

    洛谷loj Desription Bob 喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的方法.现在他有个问题. 现在他有座古城堡,古城堡的路形成一棵树.他要在这棵树的节点上放置最少数 ...

  5. [洛谷P2016] 战略游戏 (树形dp)

    战略游戏 题目描述 Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题. 他要建立一个古城堡,城堡中的路形成一棵树.他要在这棵树的结点上放置最少数目的士兵,使得 ...

  6. 洛谷P2607 [ZJOI2008]骑士(树形dp)

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

  7. 洛谷$2014$ 选课 背包类树形$DP$

    luogu Sol 阶段和状态都是树形DP板子题,这里只讲一下背包的部分(转移)叭 它其实是一个分组背包模型,具体理解如下: 对于一个结点x,它由它的子结点y转移而来 在子结点y为根的树中可以选不同数 ...

  8. 洛谷 P2607 [ZJOI2008]骑士 树形DP

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

  9. 洛谷 P1270 “访问”美术馆(树形DP)

    P1270 “访问”美术馆 题目描述 经过数月的精心准备,Peer Brelstet,一个出了名的盗画者,准备开始他的下一个行动.艺术馆的结构,每条走廊要么分叉为两条走廊,要么通向一个展览室.Peer ...

随机推荐

  1. Linux永久开放端口

    /sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT /sbin/iptables -I INPUT -p tcp --dport 3306 -j A ...

  2. JZOJ 1349. 最大公约数 (Standard IO)

    1349. 最大公约数 (Standard IO) Time Limits: 1000 ms Memory Limits: 65536 KB Description 小菜的妹妹小诗就要读小学了!正所谓 ...

  3. 观察者模式(Observer)和发布-订阅者模式(Publish/Subscribe)区别

    观察者模式:定义一对多的关系,让多个观察对象同时监听某一个主题对象,主题对象状态发生变化就通知所有观察者对象.所以它是由两类对像组成:Subject主题+Observer观察者.主题发布事件,观察者通 ...

  4. Hyperledger Fabric1.4环境搭建

    参考文档:https://www.cnblogs.com/cbkj-xd/p/11067790.html 1. 设置下载源为阿里源 sudo vim /etc/apt/sources.list 在配置 ...

  5. NoVNC API 文档翻译

    原文地址:https://github.com/novnc/noVNC/blob/master/docs/API.md 时间:2019-05-21     noVNC API The interfac ...

  6. 【.net core】电商平台升级之微服务架构应用实战

    一.前言 这篇文章本来是继续分享IdentityServer4 的相关文章,由于之前有博友问我关于微服务相关的问题,我就先跳过IdentityServer4的分享,进行微服务相关的技术学习和分享.微服 ...

  7. Vue2.0 【第一季】第4节 v-text & v-html

    目录 Vue2.0 [第一季]第4节 v-text & v-html 第四节 v-text & v-html Vue2.0 [第一季]第4节 v-text & v-html 第 ...

  8. JavaScript中的内存释放

    C.C++语言需要手动管理内存的分配与释放(常用方法:malloc(), calloc(), realloc()和free()等).而JavaScript与Java.C#相似,内置了垃圾回收器,能自动 ...

  9. 公共卫生GIS共享服务平台

    1   系统详细设计 1.1 GIS共享服务管理 1.1.1 概述 GIS共享服务管理是本系统的重要组成部分,它实现了对各类地图数据.业务资源数据的集成统一管理,提供了一个平台级的管理解决方案,能够往 ...

  10. 03.文件I/O

    UNIX系统中的大多数文件I/O只需用到5个函数:open.read.write.lseek和close. 本章所说明的函数称为不带缓冲的I/O.不带缓冲指的是每个read和write都调用内核中的一 ...