NOIP 2009 最优贸易 题解
一道最短路的题,找一个买入和卖出相差最高的点即可,我们先以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 最优贸易 题解的更多相关文章
- NOIP 2009 最优贸易
题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分 为双向通行的道路 ...
- 「NOIP2009」最优贸易 题解
「NOIP2009」最优贸易 题解 题目TP门 题目描述 \(C\)国有\(n\)个大城市和\(m\)条道路,每条道路连接这\(n\)个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 ...
- 洛谷 P1073 最优贸易 题解
题面 大家都是两遍SPFA吗?我这里就一遍dp啊: 首先判断对于一个点u,是否可以从一号点走到这里,并且可以从u走到n号点: 对于这样的点我们打上标记: 那么抛出水晶球的点一定是从打上标记的点中选出一 ...
- Codevs 1173 最优贸易 2009年NOIP全国联赛提高组
1173 最优贸易 2009年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description [问题描述] C 国有n ...
- 最优贸易 2009年NOIP全国联赛提高组(最短路)
最优贸易 2009年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description [问题描述]C ...
- 最优贸易 NOIP 2009 提高组 第三题
题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分 为双向通行的道路 ...
- Luogu P1073 最优贸易
题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双 ...
- 洛谷 P1073 最优贸易 解题报告
P1073 最优贸易 题目描述 \(C\)国有\(n\)个大城市和\(m\)条道路,每条道路连接这\(n\)个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这\(m\)条道路中有一部分 ...
- NOIP提高组题目归类+题解摘要(2008-2017)
因为前几天作死立了一个flag说要把NOIP近十年的题目做一做,并写一个题目归类+题解摘要出来,所以这几天就好好的(然而还是颓废了好久)写了一些这些往年的NOIP题目. 这篇博客有什么: 近十年NOI ...
随机推荐
- Kubernetes容器集群管理环境 - 完整部署(上篇)
Kubernetes(通常称为"K8S")是Google开源的容器集群管理系统.其设计目标是在主机集群之间提供一个能够自动化部署.可拓展.应用容器可运营的平台.Kubernetes ...
- wpf界面按钮自动点击
Button Button = new Button();Button.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));//在按钮生成时便会自动触 ...
- C#连接Oracle数据库字符串(引入DLL)
需求:从一台Oracle数据库获取数据,本以为是很简单的事情,直接将原来的SqlClient换成OracleClient调用,结果远没自己想的简单.要么安装Oracle客户端,要么安装PLSQL.网上 ...
- .xxx.sh脚本无法启动,原来都是特殊字符搞的鬼?
今天遇到个趣的问题,linux上springboot启动,连接达梦数据库报错. 解决思路: 1)是不是数据库本身有问题,客户端登录没问题. 2)排查是不是war包问题,本地连接数据库,没问题. 3)是 ...
- Java——异常处理
1.java提供的异常不可能预见所有的问题,所以需要自己定义异常类,必须从已有的异常类继承,最好选择意思相近的异常类继承. class MyException extends Exception{} ...
- mybatis学习的终极宝典
**********************************************************************************************一:myba ...
- 如何搭建环境---初识mybatis
一:mybatis概念1:简介 MyBatis本是apache的一个开源项目iBatis,2010年改名为 MyBatis, MyBatis 是一个基于Java的持久层框架.( ...
- Git下载加速教程
方法一 大家普遍采取的是更改本地的host文件,然后cmd命令刷新 1.访问这里,依次获取下面三个url的ping的ip github.com github.global.ssl.fastly.net ...
- 【模板】珂朵莉树(ODT)(Codeforces 896C Willem, Chtholly and Seniorious)
题意简述 维护一个数列,支持区间加,区间赋值,区间求第k小,区间求幂和 数据随机 题解思路 ODT是一种基于std::set的暴力数据结构. 每个节点对应一段区间,该区间内的数都相等. 核心操作spl ...
- Git原理入门简析
为了获得更好的阅读体验,建议访问原地址:传送门 前言: 之前听过公司大佬分享过 Git 原理之后就想来自己总结一下,最近一忙起来就拖得久了,本来想塞更多的干货,但是不喜欢拖太久,所以先出一版足够入门的 ...