luogu1073 最优贸易 (tarjan+dp)
tarjan缩点,然后按照拓扑序,做1号点能到达的点的答案
具体做法是对每个点记一个min[i],max[i],vis[i]和ans[i]
做拓扑序的时候,假设在从u点开始做,有边u到v,如果vis[u]=1,则则
vis[v]=1(初始时vis[bel[1]]=1);
更新在v点及以前买进的最小进价:min[v]=min{min[v],min[u]}
统计在v点卖出的答案:ans[v]=max{ans[u],ans[v],max[v]-min[v]}
则最后答案就是ans[bel[N]]
貌似还有做两遍spfa的做法...不管了
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<queue>
- #include<vector>
- #define LL long long int
- #define inf 0x3f3f3f3f
- using namespace std;
- const int maxn=,maxm=;
- LL rd(){
- LL x=;char c=getchar();int neg=;
- while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
- while(c>=''&&c<='') x=x*+c-'',c=getchar();
- return x*neg;
- }
- int N,M;
- int eg[maxm][],egh[maxn],ect;
- int eg2[maxm][],egh2[maxn],ect2;
- int val[maxn],in[maxn],bel[maxn];
- int dfn[maxn],low[maxn],stk[maxn],sct,tot,pct;
- int mi[maxn],ma[maxn],ans[maxn];
- vector<int> hav[maxn];
- bool instk[maxn],flag[maxn],vis[maxn];
- inline void adeg(int a,int b){
- eg[ect][]=b;eg[ect][]=egh[a];egh[a]=ect++;
- }
- inline void adeg2(int a,int b){
- eg2[ect2][]=b;eg2[ect2][]=egh2[a];egh2[a]=ect2++;
- in[b]++;
- }
- void tarjan(int x){
- dfn[x]=low[x]=++tot;instk[x]=;stk[++sct]=x;
- for(int i=egh[x];i!=-;i=eg[i][]){
- int j=eg[i][];
- if(instk[j]) low[x]=min(low[x],dfn[j]);
- else if(!dfn[j]) {
- tarjan(j);low[x]=min(low[x],low[j]);
- }
- }if(dfn[x]==low[x]){
- pct++;mi[pct]=inf;ma[pct]=-inf;
- while(sct){
- mi[pct]=min(mi[pct],val[stk[sct]]);
- ma[pct]=max(ma[pct],val[stk[sct]]);
- bel[stk[sct]]=pct;
- instk[stk[sct]]=;
- hav[pct].push_back(stk[sct]);
- if(stk[sct--]==x) break;
- }
- }
- }
- int main(){
- int i,j,k;
- //freopen("testdata.in","r",stdin);
- N=rd(),M=rd();
- for(i=;i<=N;i++) val[i]=rd();
- memset(egh,-,sizeof(egh));memset(egh2,-,sizeof(egh2));
- for(i=;i<=M;i++){
- int a=rd(),b=rd(),c=rd();
- adeg(a,b);if(c==) adeg(b,a);
- }for(i=;i<=N;i++) if(!dfn[i]) tarjan(i);
- for(i=;i<=pct;i++){
- memset(flag,,pct+);
- for(j=;j<hav[i].size();j++){
- for(k=egh[hav[i][j]];k!=-;k=eg[k][]){
- if(i==bel[eg[k][]]) continue;
- if(!flag[bel[eg[k][]]]) adeg2(i,bel[eg[k][]]);
- flag[bel[eg[k][]]]=;
- }
- }
- }
- queue<int> q;vis[bel[]]=;
- for(i=;i<=pct;i++){
- if(!in[i]) q.push(i);
- }
- while(!q.empty()){
- int p=q.front();q.pop();
- for(i=egh2[p];i!=-;i=eg2[i][]){
- j=eg2[i][];
- if(vis[p]){
- vis[j]=;ans[j]=max(ans[j],ans[p]);
- mi[j]=min(mi[j],mi[p]);
- ans[j]=max(ans[j],ma[j]-mi[j]);
- }
- if(!(--in[j])) q.push(j);
- }
- }
- printf("%d\n",ans[bel[N]]);
- }
luogu1073 最优贸易 (tarjan+dp)的更多相关文章
- [luogu1073 Noip2009] 最优贸易 (dp || SPFA+分层图)
传送门 Description C 国有n 个大城市和m 条道路,每条道路连接这n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这m 条道路中有一部分为单向通行的道路,一部分 为 ...
- [NOIP2009][LuoguP1073] 最优贸易 - Tarjan,拓扑+DP
Description&Data 题面:https://www.luogu.org/problemnew/show/P1073 Solution Tarjan对联通块缩点,在DAG上按照拓扑序 ...
- 题解【luogu1073 最优贸易】
Solution 考虑原图是 DAG 时怎么做. 拓扑排序 + dp ,令 dp[i] 表示 \(1\) 到 \(i\) 的路径上最小的卖出价格.转移方程就是对每一个可以到达这个点的 dp 取个 mi ...
- codevs 1173 最优贸易(DP+SPFA运用)
/* 中国的题目 ——贱买贵卖 0.0 这题wa了好多遍 第一遍看着题 哎呀这不很简单嘛 从起点能到的点都是合法的点 然后统计合法的点里最大最小值 然后printf 也不知道哪里来的自信 就这么交了 ...
- 洛谷P1073 最优贸易 [图论,DP]
题目传送门 最优贸易 题目描述 C 国有n 个大城市和m 条道路,每条道路连接这n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这m 条道路中有一部分为单向通行的道路,一部分为双向 ...
- 洛谷 P1073 最优贸易 解题报告
P1073 最优贸易 题目描述 \(C\)国有\(n\)个大城市和\(m\)条道路,每条道路连接这\(n\)个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这\(m\)条道路中有一部分 ...
- 「NOIP2009」最优贸易 题解
「NOIP2009」最优贸易 题解 题目TP门 题目描述 \(C\)国有\(n\)个大城市和\(m\)条道路,每条道路连接这\(n\)个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 ...
- [NOIP2009]最优贸易(图论)
[NOIP2009]最优贸易 题目描述 CC 国有 \(n\) 个大城市和 \(m\) 条道路,每条道路连接这 \(n\) 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 \(m\ ...
- NOIP2009 最优贸易
3. 最优贸易 (trade.pas/c/cpp) [问题描述] C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间 多只有一条道路直接相连.这 m 条道 ...
随机推荐
- Jlink使用技巧之合并烧写文件
前言 IAP(In-application-programming),即在应用中编程.当产品发布之后,可以通过网络方便的升级固件程序,而不需要拆机下载程序.IAP系统的固件一般由两部分组成,即Boot ...
- GitFlow原理浅析
一.Git优点 分布式存储 , 本地仓库包含了远程仓库的所有内容 . 安全性高 , 远程仓库文件丢失了也不怕 优秀的分支模型 , 创建/合并分支非常的方便 方便快速 , 由于代码本地都有存储 , 所以 ...
- springboot 中事件监听模型的一种实现
目录 定义事件本身 定义事件源 定义监听者 一.需要实现 ApplicationListener 二.使用 @EventListener 注解 测试 项目结构 前言: 事件监听模型是一种常用的设计模式 ...
- Helper
//检测端口是否使用 public static bool VerifyListenerPort(int port) { bool inUse = false; System.Net.NetworkI ...
- html绝对路径,相对路径
.com/eat.php中引用.com/includes/headrt.php的话写includes/header.php .com/service/eat.php中引用.com/includes/h ...
- RocketMQ 简单梳理 及 集群部署笔记
一.RocketMQ 基础知识介绍Apache RocketMQ是阿里开源的一款高性能.高吞吐量.队列模型的消息中间件的分布式消息中间件. 上图是一个典型的消息中间件收发消息的模型,RocketMQ也 ...
- Linux下性能调试工具运维笔记
作为一名资深的linux运维工程师,为方便了解和追求服务器的高性能,如cpu.内存.io.网络等等使用情况,要求运维工程师必须要熟练运用一些必要的系统性能调试工具,liunx下提供了众多命令方便查看各 ...
- xcode archive 去掉dsym文件和添加dsym文件
打包慢,让人发狂!!! 所以我们尝试的去掉一些测试时候用不到的东西 比如DSYM: 这DSYM是收集奔溃的.在测试的时候不需要这些东西的所以去掉就好: 项目 Build Settings -> ...
- C. Good Array
链接 [https://codeforces.com/contest/1077/problem/C] 题意 给你一个数组,问你能去掉某个数使得剩下的数中某个数是其他数的和 输出个数以及他们的下标 分析 ...
- 《Linux内核分析》实践2
<Linux及安全>实践2 一.Linux基本内核模块 1.1什么是内核模块 linux模块是一些可以作为独立程序来编译的函数和数据类型的集合.之所以提供模块机制,是因为Linux本身是一 ...