CodeForces - 894E Ralph and Mushrooms (强连通缩点+dp)
题意:一张有向图,每条边上都有wi个蘑菇,第i次经过这条边能够采到w-(i-1)*i/2个蘑菇,直到它为0。问最多能在这张图上采多少个蘑菇。
分析:在一个强连通分量内,边可以无限次地走直到该连通块内蘑菇被采完为止,因此每个强连通分量内的结果是确定的。
设一条边权值为w,最大走过次数为t,解一元二次方程得 t = (int)(1+sqrt(1+8w));则该边对所在连通块的贡献为w*t - (t-1)*t*(t+1)/6。
而不在任何一个强连通分量内的边,最多只能走一次。所以在缩点后的DAG上进行dp即可。
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int maxn =1e6+5; struct Edge{int v,next;LL val; }edges[maxn],E[maxn]; int head[maxn],tot,H[maxn],tt; stack<int> S; int pre[maxn],low[maxn],sccno[maxn],dfn,scc_cnt; LL W[maxn]; LL dp[maxn]; void init() {tot = dfn = scc_cnt=tt=0;memset(H,-1,sizeof(H));memset(W,0,sizeof(W));memset(dp,0,sizeof(dp));memset(pre,0,sizeof(pre));memset(sccno,0,sizeof(sccno));memset(head,-1,sizeof(head)); }void AddEdge(int u,int v,LL val) {edges[tot] = (Edge){v,head[u],val};head[u] = tot++; }void Tarjan(int u) {int v;pre[u]=low[u]=++dfn;S.push(u);for(int i=head[u];~i;i=edges[i].next){v= edges[i].v;if(!pre[v]){Tarjan(v);low[u]=min(low[u],low[v]);}else if(!sccno[v]){low[u]=min(low[u],pre[v]);}}if(pre[u]==low[u]){int x;++scc_cnt;for(;;){x = S.top();S.pop();sccno[x]=scc_cnt;if(x==u)break;}} }void nAddEdge(int u,int v,LL w) {E[tt] = (Edge){v,H[u],w};H[u] = tt++; }LL dfs(int u) {if(dp[u]) return dp[u];for(int i=H[u];~i;i=E[i].next){int v = E[i].v;dp[u] = max(dp[u],dfs(v)+E[i].val);}dp[u]+=W[u];return dp[u]; }int main() {#ifndef ONLINE_JUDGEfreopen("in.txt","r",stdin);freopen("out.txt","w",stdout);#endifint N,M; while(scanf("%d%d",&N,&M)==2){init();int st,u,v; LL w;while(M--){scanf("%d%d%lld",&u,&v,&w);AddEdge(u,v,w);}scanf("%d",&st);for(int i=1;i<=N;++i){if(!pre[i]){Tarjan(i);}}for(int u =1;u<=N;++u){for(int i =head[u];~i;i = edges[i].next){v = edges[i].v;LL w = edges[i].val;if(sccno[u]!=sccno[v]){nAddEdge(sccno[u],sccno[v],w);}else{int t = (int)(1+sqrt(1+8*w))/2;W[sccno[u]] += (LL)t*w - (LL)(t-1)*t*(t+1)/6;}}}for(int i=1;i<=scc_cnt;++i){if(!dp[i]){dfs(i);}}printf("%lld\n",dp[sccno[st]]);}return 0; }
转载于:https://www.cnblogs.com/xiuwenli/p/9494938.html
CodeForces - 894E Ralph and Mushrooms (强连通缩点+dp)相关推荐
- 【Codeforces】894E.Ralph and Mushrooms Tarjan缩点+DP
题意 给定$n$个点$m$条边有向图及边权$w$,第$i$次经过一条边边权为$w-1-2.-..-i$,$w\ge 0$给定起点$s$问从起点出发最多能够得到权和,某条边可重复经过 有向图能够重复经过 ...
- Poj 2186 Popular Cows(Tarjan 强连通缩点)
传送门:Poj 2186 题意:给你n头牛,m种关系,A牛认为B牛是popular的,B牛认为C牛是popular的,则A也认为C是popular的,问最终有几头被所有牛认为是popular的牛 题解 ...
- BZOJ1051 [HAOI2006]受欢迎的牛 Tarjan 强连通缩点
欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1051 题意概括 有n只牛,有m个羡慕关系. 羡慕关系具有传递性. 如果A羡慕B,B羡慕C,那么我们 ...
- 2019ICPC(银川) - Delivery Route(强连通缩点+分块最短路)
题目链接:点击查看 题目大意:给出n个点和m条边构成的图,每条边都有权值,其中m1条边是双向的,且权值非负,有m2条边是单向的,且权值可负,现在要求从给定起点st到其他每个点的最短路,若不存在路径则输 ...
- HDU - 4685 Prince and Princess(强连通缩点+二分图完备匹配)
题目链接:点击查看 题目大意:给出n个王子和m个公主,每个王子都有喜欢的公主,题目需要我们在尽可能多的王子可以匹配到喜欢的公主的情况下,求出每个王子所能娶的所有公主,必须保证王子娶了其中任何一个之后, ...
- POJ - 1904 King's Quest(强连通缩点)
题目链接:点击查看 题目大意:给出n个王子和n个公主,每个王子都有喜欢的公主,每个王子初始时都娶到了一位喜欢的公主,题目需要我们求出每个王子所能娶的所有公主,必须保证王子娶了其中任何一个之后,其他的王 ...
- POJ - 1236 Network of Schools(强连通缩点)
题目链接:点击查看 题目大意:一个学校连接在一个计算机网络上,学校之间存在软件支援协议,每个学校都有它应支援的学校名单(学校A支援学校B,并不表示学校B一定支援学校A).当某校获得一个新软件时,无论是 ...
- 有向图缩点:tarjan强连通缩点(模板)
SCC强连通缩点:(用之前记得init) 可以将有向图转换为一个 DAG 图,然后进行拓扑 const int N=1e4+100;const int M=1e5+100;struct Egde {i ...
- 图论--SCC强连通缩点--Tarjan
强连通缩点与双连通缩点大同小异,也就是说将强连通分支缩成一个点之后,没有强连通,成为有向无环图,在对图进行题目的操作. // Tarjan算法求有向图强连通分量并缩点 #include<iost ...
最新文章
- R语言ggplot2可视化并添加特定区间的回归线、R原生plot函数可视化并添加特定区间的回归线:Add Regression Line Between Certain Limits
- python os.popen.readlines异常_python中执行sed命令操作源文件时出现错误
- Filter案例之登录验证
- Kafka笔记-搭建及单机生产者、消费者操作
- iOS-贝塞尔曲线之自定义饼图
- Oracle使用ODBC连接配置
- 编译qt的oracle驱动,怎样编译Qt下的Oracle驱动
- 路由与交换|实验一 路由器基本配置
- Office Excel 插入电子签名 实现多人电子签名可追溯
- 第30集丨本来的面目:认识你自己
- 基于大数据的银行反欺诈的分析报告 【转载,可用于风控系统架设借鉴】
- java中switch的用法和逻辑运算符
- 苹果 macOS 12.4 正式版发布
- 4年外包终上岸,我只能说这类公司能不去就不去..
- php大商创 安装,新零售电商系统:大商创X安装教程【宝塔环境】
- chinapay扫码支付
- win10内置Ubuntu子系统安装及其图形化界面安装
- 【Cityengine】Cityengine2019安装使用及城市模型构建
- 2P4M-ASEMI代理伟达原装单向可控硅2P4M
- 6612345超级浏览器 集网页打印、读取身份证、拍照、读取串口等功能为一体的超级浏览器