题目:洛谷P1073、Vijos P1754、codevs1173。

题目大意:有n点m边的图,边分有向和无向。每个点有一个价格,用这个价格可以买入或卖出一个东西。一个人从1出发,要到n,途中可以买入卖出一次(可以不买入卖出),问最多能赚多少钱?

解题思路:首先,要在点i卖出,买入的最低价格为点1到点i的所有路径中,经过的价格最低的一个点的价格。这个用一个BFS扫一遍即可。

然后,有些点是不能到n的(因为有有向边),这些点不能卖出。要求哪些点能到n,只需建反向图,再在反向图里从n开始BFS一遍即可。最后即可得出答案。

C++ Code:

#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
vector<int>G[100005],G2[100005];
int n,m,money[100005],minE[100005];
bool used[100005],ok[100005];
queue<int>q;
inline void addedge(int from,int to,int isTwo){
G[from].push_back(to);
if(isTwo==2)G[to].push_back(from);
}
inline void addINVedge(int from,int to,int isTwo){
G2[to].push_back(from);
if(isTwo==2)G2[from].push_back(to);
}
void BFS(int t){
q.push(t);
memcpy(minE,money,sizeof minE);
memset(used,0,sizeof used);
used[t]=1;
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=0;i<G[u].size();++i){
int v=G[u][i];
if(minE[v]>minE[u]){
minE[v]=minE[u];
if(!used[v]){
used[v]=true;
q.push(v);
}
}else
if(!used[v]){
used[v]=true;
q.push(v);
}
}
}
}
void BFS2(int t){
q.push(t);
memset(ok,0,sizeof ok);
ok[t]=true;
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=0;i<G2[u].size();++i){
int v=G2[u][i];
if(!ok[v]){
ok[v]=true;
q.push(v);
}
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)scanf("%d",money+i);
while(m--){
int u,v,two;
scanf("%d%d%d",&u,&v,&two);
addedge(u,v,two);
addINVedge(u,v,two);
}
BFS(1);
BFS2(n);
int ans=0;
for(int i=1;i<=n;++i)
if(ok[i]){
int p=money[i]-minE[i];
if(p>ans)ans=p;
}
printf("%d\n",ans);
return 0;
}

[NOIP2009提高组]最优贸易的更多相关文章

  1. P1073 [NOIP2009 提高组] 最优贸易 (最短路spfa)

    本题就是在一条1-n的路径上找p,q(先经过p),使得q-p最大. 考虑建正反图,正图上求出d[x],表示1-x的路径经过的节点最小值,反图上则从n开始求出f[x],x-n的最大值,最后枚举断点i,取 ...

  2. 洛谷 P1073 最优贸易 & [NOIP2009提高组](反向最短路)

    传送门 解题思路 很长的题,实际上在一个有向图(点有点权)中求一个从起点1到终点n的路径,使得这条路径上点权最大的点与点权最小的点的差值最大(要求必须从点权较小的点能够走到点权较大的点). ——最短路 ...

  3. [NOIP2009] 提高组 洛谷P1073 最优贸易

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

  4. Noip2009提高组总结

    Noip2009的题目还是有一定难度的,主要是搜索和最短路都是我的弱项,不检查第一遍下来只做了150分,还是这句话,素质和读题的仔细程度决定了分数.仔细想想,我们化学老师说的话没错,或许题目你都会做, ...

  5. noip2009提高组解题报告

    NOIP2009潜伏者 题目描述 R 国和S 国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动. 历尽艰险后,潜伏于 S 国的R 国间谍小C 终于摸清了S 国军用密码的编码规则: 1. S 国 ...

  6. noip2009提高组题解

    NOIP2009题解 T1:潜伏者 题目大意:给出一段密文和破译后的明文,一个字母对应一个密文字母,要求破译一段密文,如果有矛盾或有未出现密文无法破译输出failed,否则输出明文. 思路:纯模拟题 ...

  7. [NOIP2009] 提高组 洛谷P1071 潜伏者

    题目描述 R 国和 S 国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动.历尽艰险后,潜伏于 S 国的 R 国间谍小 C 终于摸清了 S 国军用密码的编码规则: 1. S 国军方内部欲发送的原 ...

  8. [NOIP2009] 提高组 洛谷P1074 靶形数独

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...

  9. [NOIP2009] 提高组 洛谷P1072 Hankson 的趣味题

    题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson.现 在,刚刚放学回家的 Hankson 正在思考一个有趣的问题. 今天在课堂上,老师讲 ...

随机推荐

  1. JavaScript学习记录二

    title: JavaScript学习记录二 toc: true date: 2018-09-13 10:14:53 --<JavaScript高级程序设计(第2版)>学习笔记 要多查阅M ...

  2. 【参考】JDBC执行存储过程的四种情况

    [1].只有输入IN参数,没有输出OUT参数 [2].既有输入IN参数,也有输出OUT参数,输出是简单值(非列表) [3].既有输入IN参数,也有输出OUT参数,输出是列表 [4].输入输出参数是同一 ...

  3. 编 写高性能的 SQL 语句注意事项

    1. IS NULL 与 IS NOT NULL不能用 null 作索引, 任何包含 null 值的列都将不会被包含在索引中. 即使索引有多列这样的情况下,只要这些列中有一列含有 null,该列就会从 ...

  4. hdu 2037 - 典型贪心*

    题目链接 给一堆电视节目的起止时间,问最多能完整收看几个节目 --------------------------------------------------------------------- ...

  5. Matlab 从入门到精通 Chapter11 文件读取I/O

    11.1 工作空间数据读取 将工作空间的变量保存为文件,可以使用save命令.  save('filename') 将文件保存在当前目录下,文件名为filename.mat save('filenam ...

  6. 一、数组---数组中的K-diff数对※※※※※

    给定一个整数数组和一个整数 k, 你需要在数组里找到不同的 k-diff 数对.这里将 k-diff 数对定义为一个整数对 (i, j), 其中 i 和 j 都是数组中的数字,且两数之差的绝对值是 k ...

  7. div隐藏但是依然占位置

    <!doctype html> <html> <head> <meta charset="utf-8"> <script ty ...

  8. Vim配置及使用

    Vim配置 1.打开~/.vimrc,将以下内容考入文件.vimrc中 "行号" set nu "高亮" syntax enable syntax on &qu ...

  9. docker下修改mysql配置文件

    原文:docker下修改mysql配置文件 版权声明:本文为博主原创文章,转载注明地址:http://blog.csdn.net/wang704987562 https://blog.csdn.net ...

  10. 【codeforces 29B】Traffic Lights

    [题目链接]:http://codeforces.com/problemset/problem/29/B [题意] 一辆车; 让从A开到B; 然后速度是v; (只有在信号灯前面才能停下来..否则其他时 ...