题目:洛谷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. 关于Tomcat的启动

    1.Tomcat分为安装版和解压版. 2.在Tomcat的解压版的bin路径下启动startup.bat的时候,如果没有启动成功,请检查是否设置了JAVA_HOME 3.建议不要在环境变量里面设置CA ...

  2. 【转载】java编程中'为了性能'一些尽量做到的地方

    1.尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面 第一,控制资源的使用,通过线程同步来控制资 ...

  3. 【AnjularJS系列1 】— 样式相关的指令

    最近,开始学习AngularJS. 开始记录学习AngularJS的过程,从一些很简单的知识点开始. 习惯先从实际应用的指令开始,再从应用中去体会AngularJS的优缺点.使用的场景等. 之前一直希 ...

  4. ZBrush中Zproject与SubTool的综合应用

    在ZBrush中有很多工具也需要配合子物体工具来使用,如笔刷中的Zproject(投射笔刷)就需要子物体工具来配合使用,本文将讲解一下它的用法. 1. 首先创建一个平面,在Tool(工具)面板中选择P ...

  5. React显示文件夹中SVG

    import React from 'react'; import _ from 'lodash'; import styles from './iconPicker.less'; const req ...

  6. BZOJ 2560(子集DP+容斥原理)

    2560: 串珠子 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 757  Solved: 497[Submit][Status][Discuss] ...

  7. [HDU5688]2016"百度之星" - 资格赛 Problem D

    题目大意:给你n个字符串,如果一个字符串可以通过重新排列变成另一个字符串,则认为这两个字符串相等.每输入一个字符串,输出这个字符串和与它相等的之前出现了几次. 解题思路:我们可以用map保存一个字符串 ...

  8. [codevs3955]最长严格上升子序列(加强版)

    题目大意:给你一个序列,要你求该序列中最长严格上升子序列的长度. 解题思路:此题算是一道LIS模板题.普通的$O(n^2)$的LIS是会TLE的,因为$n\le 1000000$,所以此题要用单调队列 ...

  9. 紫书 习题 8-21 UVa 1621 (问题分析方法)

    知道是构造法但是想了挺久没有什么思路. 然后去找博客竟然只有一篇!!https://blog.csdn.net/no_name233/article/details/51909300 然后博客里面又说 ...

  10. 按shift键调出命令行的脚本

    打开Notepad++,粘贴以下命令,并将文件命名为opencmdhere.reg(注意:文件编码格式为UCS-2 Little Endian,否则会导致中文乱码),再双击打开即可 Windows R ...