一道最短路的题,找一个买入和卖出相差最高的点即可,我们先以1为起点跑spfa,d1[x]不再表示距离而表示能够经过权值最小的节点的权值即

if(d1[y]>min(d1[x],price[y])){
d1[y]=min(d1[x],price[y]);
if(!v[y]) q.push(y),v[y]=1;
}

我们在建反图,对于n点再跑spfa,算出最大值即

if(d2[y]<max(d2[x],price[y])){
d2[y]=max(d2[x],price[y]);
if(!v[y]) q.push(y),v[y]=1;
}

最后枚举每一个节点用d2[x]-d1[x]更新最大值即可

代码

#include<bits/stdc++.h>
using namespace std;
const int N=100010,M=500010;
int tot1,tot2,head[3][N],ver[3][M],Next[3][M];
int d1[N],d2[N],price[N];
bool v[N];
int x,y,z,n,m,ans;
queue<int> q;
void add1(int x,int y){
ver[1][++tot1]=y;Next[1][tot1]=head[1][x];head[1][x]=tot1;
}
void add2(int x,int y){
ver[2][++tot2]=y;Next[2][tot2]=head[2][x];head[2][x]=tot2;
}
void spfa(){
memset(d1,0x3f,sizeof(d1));
d1[1]=price[1];v[1]=1;
q.push(1);
while(!q.empty()){
int x=q.front();q.pop();
v[x]=0;
for(int i=head[1][x];i;i=Next[1][i]){
int y=ver[1][i];
if(d1[y]>min(d1[x],price[y])){
d1[y]=min(d1[x],price[y]);
if(!v[y]) q.push(y),v[y]=1;
}
}
}
memset(v,0,sizeof(v));
d2[n]=price[n];v[n]=1;
q.push(n);
while(!q.empty()){
int x=q.front();q.pop();
v[x]=0;
for(int i=head[2][x];i;i=Next[2][i]){
int y=ver[2][i];
if(d2[y]<max(d2[x],price[y])){
d2[y]=max(d2[x],price[y]);
if(!v[y]) q.push(y),v[y]=1;
}
}
} }
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;++i) scanf("%d",&price[i]);
for(int i=1;i<=m;++i){
scanf("%d %d %d",&x,&y,&z);
if(z==1) add1(x,y),add2(y,x);
else{
add1(x,y);add1(y,x);
add2(x,y);add2(y,x);
}
}
spfa();
for(int i=1;i<=n;++i){
ans=max(d2[i]-d1[i],ans);
}
printf("%d",ans);
return 0;
}

NOIP 2009 最优贸易 题解的更多相关文章

  1. NOIP 2009 最优贸易

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

  2. 「NOIP2009」最优贸易 题解

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

  3. 洛谷 P1073 最优贸易 题解

    题面 大家都是两遍SPFA吗?我这里就一遍dp啊: 首先判断对于一个点u,是否可以从一号点走到这里,并且可以从u走到n号点: 对于这样的点我们打上标记: 那么抛出水晶球的点一定是从打上标记的点中选出一 ...

  4. Codevs 1173 最优贸易 2009年NOIP全国联赛提高组

    1173 最优贸易 2009年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description [问题描述] C 国有n ...

  5. 最优贸易 2009年NOIP全国联赛提高组(最短路)

    最优贸易 2009年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description [问题描述]C ...

  6. 最优贸易 NOIP 2009 提高组 第三题

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

  7. Luogu P1073 最优贸易

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

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

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

  9. NOIP提高组题目归类+题解摘要(2008-2017)

    因为前几天作死立了一个flag说要把NOIP近十年的题目做一做,并写一个题目归类+题解摘要出来,所以这几天就好好的(然而还是颓废了好久)写了一些这些往年的NOIP题目. 这篇博客有什么: 近十年NOI ...

随机推荐

  1. 图片验证码+session

    生成随机验证码 #!/usr/bin/env python # -*- coding:utf-8 -*- import random from PIL import Image, ImageDraw, ...

  2. Linux再学习(一)-学习路线规划

    1 抛弃旧文化,迎接Linux命令新文化 Linux第一步,从Windows思维,切换到Linux的"命令行+文件"模式 在Linux中,做什么都有相应命令.一般就在bin或者sb ...

  3. ORACLE 的CONNECT BY、START WITH,CONNECT_BY_ROOT、CONNECT_BY_ISLEAF、SYS_CONNECT_BY_PATH,LEVEL的使用(Hierarchical query-层次查询)

    如果表中存在层次数据,则可以使用层次化查询子句查询出表中行记录之间的层次关系基本语法: START WITH <condition1> CONNECT BY [ NOCYCLE ] < ...

  4. JavaFX 集成 Sqlite 和 Hibernate 开发爬虫应用

    目录 [隐藏] 0.1 前言: 0.2 界面 0.3 Maven 环境 0.4 项目结构 0.5 整合 Hibernate 0.5.1 SQLiteDialect.java 数据库方言代码 0.5.2 ...

  5. 【Java例题】3.1 7、11、13的倍数

    1.找出1~5000范围内分别满足如下条件的数: (1) 7或11或13的倍数 (2) 7.11,或7.13或11.13的倍数 (3) 7.11和13的倍数. package chapter3; pu ...

  6. 喜大普奔 | 微信小程序支持PC端打开了

    微信小程序可以在PC端打开啦 微信PC版发布了v2.7.0测试版,其中一个重磅的功能就是:支持打开聊天中分享的小程序 咖啡君这么喜欢尝鲜的人自然是在第一时间下载进行了体验 安装成功,会有功能更新说明 ...

  7. 记一次mysql主从同步因断电产生的不能同步问题 1236 1032

    背景: 项目新上线一个月,qa需要测试断电服务拉起,服务拉起成功后,发现mysql主从异常,以下是发现的问题以及解决方案 问题1: Slave_IO_Running:  No 一方面原因是因为网络通信 ...

  8. Markdown的最常用标记符号

    Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式. md就是markdown 如果你要把这段文字定义成标题,只需要在前面加上一个#号, ...

  9. 带图标和多行显示的ListBox

    源码https://www.codeproject.com/Articles/15464/Extending-the-ListBox-to-show-more-complex-items 定义控件 u ...

  10. JDK集合面试20问

    1. HashMap的内部实现原理是什么? HashMap内部实现原理是数组+链表,通过散列算法将key值散列到数组中,如果到相同的位置,则通过拉链法解决散列冲突.在JDK8中新增了红黑树结构,当Ha ...