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 ...
随机推荐
- 一文带你彻底理解 JavaScript 原型对象
一.什么是原型 原型是Javascript中的继承的基础,JavaScript的继承就是基于原型的继承. 1.1 函数的原型对象 在JavaScript中,我们创建一个函数A(就是声明一个函数), 那 ...
- MyBatis 简介与入门
简介 什么是 MyBatis ? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.My ...
- LeetCode :2.两数相加 解题报告及算法优化思路
题目连接:2.两数相加 题意 题目难度标为 中等, 因为题意上有一部分理解难度,以及需要数据结构的链表基础. 还不知道到链表的童鞋可以粗略的看下百度百科或者是翻出数据结构的书看一看,通俗一点的语言来解 ...
- Spark 系列(七)—— 基于 ZooKeeper 搭建 Spark 高可用集群
一.集群规划 这里搭建一个 3 节点的 Spark 集群,其中三台主机上均部署 Worker 服务.同时为了保证高可用,除了在 hadoop001 上部署主 Master 服务外,还在 hadoop0 ...
- java并发编程(九)----(JUC)CyclicBarrier
上一篇我们介绍了CountDownlatch,我们知道CountDownlatch是"在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待",即CountDownL ...
- c# 多进程写信息到前台控件
private void DispMsg(string strMsg, bool clearlb = false) { if (this.lberror.InvokeRequired == false ...
- c#引用本地dll发布后运行exe错误
在config 文件夹 configuration 配置节点下面 添加 <runtime> <gcConcurrent enabled="true" /> ...
- SAP-采购订单跟踪报表
*&---------------------------------------------------------------------**& Report ZMM_CGDDFX ...
- 记录一次Git解决CONFLICT冲突
目录 记录一次Git解决CONFLICT冲突 1.CONFLICT产生的原因 2.Git正确的LIANGZHONG 使用流程 2.1 暂存,拉取,恢复暂存,合并(如果有冲突),提交,推送 2.2 将本 ...
- Sqlserver 查询把多行内容拼成一个字符串
当使用:SELECT ','+Id FROM dbo.Test FOR XML PATH('')); //这样读取的数据虽然是1,2,3,4,但是仍然是xml格式,所以当数据超过2033时候,用sql ...