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 条道 ...
随机推荐
- mybatis 缓存的使用, 看这篇就够了
目录 1 一级缓存 1.1 同一个 SqlSession 1.2 不同的 SqlSession 1.3 刷新缓存 1.4 总结 2 二级缓存 2.1 配置二级缓存 2.2 使用二级缓存 2.3 配置详 ...
- MySQL数据库服务器(YUM)安装
1. 概述2. 部署过程2.1 虚拟机console的NFS服务端配置2.2 虚拟机node15的NFS客户端配置2.3 虚拟机安装MySQL环境2.4 配置MySQL3. 错误及解决3.1 启动失败 ...
- 新人入坑Redis必会的吐血总结
新人入坑Redis必会的吐血总结 一.什么是Redis Redis是一个使用C语言开发的开源的高性能的key-value存储系统,我们可以把它近似理解为Java Map.简单来讲,Redis是一种NO ...
- mongo java 踩坑记
为什么会有这么多坑 1. Java会把 id:String = "合法ObjectId" 好心好意的 转为 _id:ObjectId 类型. 2. 为了避免第1点, 我定义了 ...
- 四则运算coding
https://coding.net/u/ztf1641429293/p/sizeyunshuan/git/blob/master/Sizenyunsuan.java
- Popush End
coconut: (咳咳)作为一名后台开发者,我觉得自己在这次作业完成中最大的收获就是跟node.js的异步模型打交道.首先我得出了一个这样的结论:异步模型能够提高服务器的高性能并发请求,但是却加大了 ...
- 北航MOOC客户端
我们的团队作业终于完成了,欢迎下载使用我们的北航MOOC手机客户端软件(Android端)——北航学堂,学习北航的公开课程. 安装包下载地址: http://pan.baidu.com/s/1jGvH ...
- 基于SSH框架的在线考勤系统开发的质量属性
我要开发的是一个基于SSH框架的在线考勤系统. 质量属性是指影响质量的相关因素,下面我将分别从6个系统质量属性(可用性,易用性,可修改性,性能,安全性,可测试性)来分析我的系统,以及如何实现这些质量属 ...
- 广商博客沖刺第一天(new ver):
項目名稱:廣商博客 沖刺二天傳送門 此次Sprint的目标:全部sprint任務完成 时间:1星期左右 每日立会 Daily Standup Meeting: 1#A3008 晚上8点开始,大概1小时 ...
- Excel读写方案XLSReadWriteII使用技巧总结
XLSReadWriteII是一个读写Excel的组件.他的一般已用只要按照Demo操作基本都能实现,只要不是非常复杂的应用,XLSReadWriteII还是能够胜任的. 最近被派了一个写入图库的应用 ...