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 条道 ...
随机推荐
- 在 Linux 上搭建IntelliJ IDEA license server服务器
IntelliJIDEALicenseServer_linux_amd64 ,把该文件传到服务器的某个目录,我是放在了/var/local/software目录下 sudo chmod +x ./In ...
- springboot 发送邮件+模板+附件
package com.example.demo; import org.junit.Test;import org.junit.runner.RunWith;import org.springfra ...
- Bluedroid 函数分析:BTA_GATTC_Open
进行GATT 通信,首先要打开GATT 的通道.下面我们分析BTA_GATTC_Open 这个函数: 这个函数在bta_gattc_api.c 文件中定义,这个是一个接口文件,里面没有做真正的open ...
- vue + element 实现登录注册(自定义表单验证规则)
注册页包含手机验证码登录和密码的二次验证. 效果如下: 实现代码: <template> <div> <div class="register-wrapper& ...
- ML.NET 示例:多类分类之问题分类
写在前面 准备近期将微软的machinelearning-samples翻译成中文,水平有限,如有错漏,请大家多多指正. 如果有朋友对此感兴趣,可以加入我:https://github.com/fei ...
- 线上分享-- 基于DDD的.NET开发框架-ABP介绍
前言 为了能够帮助.Net开发者开拓视野,更好的把最新的技术应用到工作中,我在3月底受邀到如鹏网.net训练营直播间为各位学弟学妹们进行ABP框架的直播分享.同时为了让更多的.NET开发者了解ABP框 ...
- Spring RPC 入门学习(3)-插入Student对象
Spring RPC 向后台传递对象 1. 新建RPC接口:StudentInterface.java package com.cvicse.ump.rpc.interfaceDefine; impo ...
- SQL大杂烩
DML 语句(数据操作语言)Insert.Update. Delete.Merge DDL 语句(数据定义语言)Create.Alter. Drop.Truncate DCL 语句(数据控制语言)Gr ...
- 个人项目junit4测试
一.题目简介 用java编写一个程序,模拟ATM柜员机. 二.源码的github链接 www.github.com/liuxianchen/test 三.所设计的模块测试用例.测试结果截图 四 心得 ...
- PAT 1003 我要通过!
https://pintia.cn/problem-sets/994805260223102976/problems/994805323154440192 “答案正确”是自动判题系统给出的最令人欢喜的 ...