题目:洛谷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 与iOS交互的简单使用

    关于导入 JavaScriptCore 这个就不说了 js交互我们首先用到webView与webView的代理 基本上是很简单,,不过后台10分的坑 以下是代码 在webView的加载完成里面 fun ...

  2. requireJS实现原理分析

    下面requireJS实现的基本思路  项目地址https://github.com/WangMaoling/require var require = (function(){ //框架版本基本信息 ...

  3. Windows下本机简易监控系统搭建(Telegraf+Influxdb+Grafana)--转

    原文地址:http://www.cnblogs.com/liugh/p/6683488.html 一.文件准备 1.1 文件名称 telegraf-1.2.1_windows_amd64.zip in ...

  4. eclipse启动错误:An internal error occurred during: "reload maven project".

    解决方案一: 简单粗暴!直接删除E:\eclipseWorkspace\.metadata目录!然后再单个导入eclipseWorkspace中的项目. 解决方案二: 打开这个配置文件:E:\ecli ...

  5. python 3.x 学习笔记11 (静态、类、属性、特殊成员方法)

    1.静态方法通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法.静态方法是不可以访问实例变量或类变量的即没有self,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什 ...

  6. OpenGL编程(六)通过三角形绘画出3D模型

    使用三角形绘制3D模型 三角形是基本的多边形,任何多变形都能由三角形组成.三角形是由三个顶点的连线组成.三个点分别是v0:v1:v2. 1.绕法 从某个顶点开始,有两种连线的方法,顺时针和逆时针,这是 ...

  7. 理解 this.initialize.apply ( this, arguments )定义对象的一种方式

    var Class = { create:function() { return function() { this.initialize.apply(this, arguments); }; } } ...

  8. vue如何给它的data值赋值

    activeDisplay的值如何改变 用$set();方法 vm.$set('b', 2) 或者 Vue.set(data, 'c', 3) this.someObject = Object.ass ...

  9. SKU和SPU表的设计

    1.什么是SKU,SPU SKU:Stock Keeping Unit (库存量单位)SKU即库存进出计量的单位,可以是以件.盒.托盘等为单位,是物理上不可分割的最小存货单元.在使用时要根据不同业态, ...

  10. js去掉字符串得第一个字符 、去掉字符串的最后一个字符

    a1 = aa[0].slice(1);  //去掉第一个字符串 a2 = a2.substr(0, a2.length - 1);