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)的更多相关文章

  1. [luogu1073 Noip2009] 最优贸易 (dp || SPFA+分层图)

    传送门 Description C 国有n 个大城市和m 条道路,每条道路连接这n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这m 条道路中有一部分为单向通行的道路,一部分 为 ...

  2. [NOIP2009][LuoguP1073] 最优贸易 - Tarjan,拓扑+DP

    Description&Data 题面:https://www.luogu.org/problemnew/show/P1073 Solution Tarjan对联通块缩点,在DAG上按照拓扑序 ...

  3. 题解【luogu1073 最优贸易】

    Solution 考虑原图是 DAG 时怎么做. 拓扑排序 + dp ,令 dp[i] 表示 \(1\) 到 \(i\) 的路径上最小的卖出价格.转移方程就是对每一个可以到达这个点的 dp 取个 mi ...

  4. codevs 1173 最优贸易(DP+SPFA运用)

    /* 中国的题目 ——贱买贵卖 0.0 这题wa了好多遍 第一遍看着题 哎呀这不很简单嘛 从起点能到的点都是合法的点 然后统计合法的点里最大最小值 然后printf 也不知道哪里来的自信 就这么交了 ...

  5. 洛谷P1073 最优贸易 [图论,DP]

    题目传送门 最优贸易 题目描述 C 国有n 个大城市和m 条道路,每条道路连接这n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这m 条道路中有一部分为单向通行的道路,一部分为双向 ...

  6. 洛谷 P1073 最优贸易 解题报告

    P1073 最优贸易 题目描述 \(C\)国有\(n\)个大城市和\(m\)条道路,每条道路连接这\(n\)个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这\(m\)条道路中有一部分 ...

  7. 「NOIP2009」最优贸易 题解

    「NOIP2009」最优贸易 题解 题目TP门 题目描述 \(C\)国有\(n\)个大城市和\(m\)条道路,每条道路连接这\(n\)个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 ...

  8. [NOIP2009]最优贸易(图论)

    [NOIP2009]最优贸易 题目描述 CC 国有 \(n\) 个大城市和 \(m\) 条道路,每条道路连接这 \(n\) 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 \(m\ ...

  9. NOIP2009 最优贸易

    3. 最优贸易 (trade.pas/c/cpp) [问题描述] C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间 多只有一条道路直接相连.这 m 条道 ...

随机推荐

  1. [Partition][Index]对于Partition表而言,是否Global Index 和 Local Index 可以针对同一个字段建立?

    对于Partition表而言,是否Global Index 和 Local Index 可以针对同一个字段建立? 实验证明,对单独的列而言,要么建立 Global Index, 要么建立 Local ...

  2. Python从菜鸟到高手(1):初识Python

    1 Python简介 1.1 什么是Python   Python是一种面向对象的解释型计算机程序设计语言,由荷兰人吉多·范罗苏姆(Guido van Rossum)于1989年发明,第一个公开发行版 ...

  3. 运行supervisorctl reload报错解决方法

    在进行守护进程时运行supervisorctl reload出现“error: <class 'socket.error'>, [Errno 2] No such file or dire ...

  4. [Entity Framework+MVC复习总结1]-WebForm与Asp.Net MVC

    一.Web开发方式的比较 二.web Form开发模型 WebForm开发优点: 1.支持事件模型开发.得益于丰富的服务器端组件,webfrom开发可以迅速的搭建web应用 2.使用方便,入门容易 3 ...

  5. 【下一代核心技术DevOps】:(二)Rancher的应用及优点简介

    1.环境选择 安装Rancher环境,一定要在干净的linux主机上进行,避免出现因配置导致的莫名其妙的问题.服务器操作系统建议CentOS7.4(内核3.10以上)低于这个版本的系统 如7.3 7. ...

  6. PEP8 Python编程规范

    官方文档: https://www.python.org/dev/peps/pep-0008/ ---------------------------------------------------- ...

  7. js实现随机的四则运算题目(2)-更新界面

    上次的代码提交完成后,有很多bug.比如函数会重复调用执行,每点击一次按钮都会在生成题目的下方直接生成新的题目,于是我在代码前面添加了如下的代码: function play_allE() { doc ...

  8. 学习github心得

    Git 是 Linux 的创始人 Linus Torvalds 开发的开源和免费的版本管理系统,利用底层文件系统原理进行版本控制的工具.Git是目前为止最著名运用最好最受欢迎的分布式的配置管理工具. ...

  9. 第一次Sprint

    项目刚开始做的话,离客户的需求应该,蛮远的. 用的是eclipse加安卓模拟器在弄. 目前主要弄APP的界面和一些主要的功能算法,各个功能板块的位置划分的内容. Github团队地址是:https:/ ...

  10. Jquery获取和修改img的src值的方法

    转自:http://www.jb51.net/article/46861.htm 获取(代码): $("#imgId")[0].src; 修改(代码): $("#imgI ...