先正向从1点出发SPFA,获得min[i],就是到达i点能最低购买到的价格,(起始点到i的路上经过的最小值)

然后反向(将图反向),从n点开始SPFA,获得max[i],就是从i点到终点能够卖出的最大的价格,(终止点到i的路上经过的最大值)

然后就是寻找差价最大的i,输出答案即可。

代码:

#include<iostream>
#include<cstring>
#include<queue>
#define MAXM 500005
#define MAXN 100005
#define INF 0x3f3f3f3f
using namespace std; int n,m;
struct edge{
int to,next;
}eg1[MAXM],eg2[MAXM];
int head1[MAXN],head2[MAXN];
int cnt1=,cnt2=;
int num[MAXN];
int Max[MAXN]; int Min[MAXN];
bool vis[MAXN];
int ans=;
queue<int> q; void add1(int a,int b){
cnt1++;
eg1[cnt1].to=b;
eg1[cnt1].next=head1[a];
head1[a]=cnt1;
}
void add2(int a,int b){
cnt2++;
eg2[cnt2].to=b;
eg2[cnt2].next=head2[a];
head2[a]=cnt2;
} int main(){
freopen("1.in","r",stdin);
memset(head1,-,sizeof(head1));
memset(head2,-,sizeof(head2)); cin>>n>>m;
for(int i=;i<=n;i++)cin>>num[i];
int a,b,c;
for(int i=;i<=m;i++){
cin>>a>>b>>c;
if(c==){
add1(b,a); add2(a,b);
}
add1(a,b); add2(b,a);
} //spfa1
memset(Min,0x3f,sizeof(Min));
memset(vis,false,sizeof(vis));
q.push(); vis[]=true; Min[]=num[];
while(!q.empty()){
int k=q.front(); q.pop();
vis[k]=false;
for(int i=head1[k];i!=-;i=eg1[i].next){
int u=eg1[i].to;
if(Min[u]>Min[k]){
Min[u]=Min[k];
if(!vis[u]){
q.push(u);
vis[u]=true;
}
}
if(Min[u]>num[u]){
Min[u]=num[u];
if(!vis[u]){
q.push(u);
vis[u]=true;
}
}
}
} //spfa2
memset(Max,0xf3,sizeof(Max));
memset(vis,false,sizeof(vis));
q.push(n); vis[n]=true; Max[n]=num[n];
while(!q.empty()){
int k=q.front(); q.pop();
vis[k]=false;
for(int i=head2[k];i!=-;i=eg2[i].next){
int u=eg2[i].to;
if(Max[u]<Max[k]){
Max[u]=Max[k];
if(!vis[u]){
q.push(u);
vis[u]=true;
}
}
if(Max[u]<num[u]){
Max[u]=num[u];
if(!vis[u]){
q.push(u);
vis[u]=true;
}
}
}
} ans=;
for(int i=;i<=n;i++){
//cout<<Min[i]<<' '<<Max[i]<<endl;
if(ans<Max[i]-Min[i]){
ans=Max[i]-Min[i];
}
}
cout<<ans<<endl; return ;
}

一开始疑问没有权值spfa怎么做...学习了!

code1173 最优贸易的更多相关文章

  1. NOIP2009 最优贸易

    3. 最优贸易 (trade.pas/c/cpp) [问题描述] C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间 多只有一条道路直接相连.这 m 条道 ...

  2. Codevs 1173 最优贸易 2009年NOIP全国联赛提高组

    1173 最优贸易 2009年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description [问题描述] C 国有n ...

  3. Luogu P1073 最优贸易

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

  4. 洛谷 P1073 最优贸易 解题报告

    P1073 最优贸易 题目描述 \(C\)国有\(n\)个大城市和\(m\)条道路,每条道路连接这\(n\)个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这\(m\)条道路中有一部分 ...

  5. CH6101 最优贸易【最短路】

    6101 最优贸易 0x60「图论」例题 描述 C国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通 ...

  6. [Luogu 1073] NOIP2009 最优贸易

    [Luogu 1073] NOIP2009 最优贸易 分层图,跑最长路. 真不是我恋旧,是我写的 Dijkstra 求不出正确的最长路,我才铤而走险写 SPFA 的- #include <alg ...

  7. 洛谷P1073 最优贸易 [图论,DP]

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

  8. 【洛谷P1073】[NOIP2009]最优贸易

    最优贸易 题目链接 看题解后感觉分层图好像非常NB巧妙 建三层n个点的图,每层图对应的边相连,权值为0 即从一个城市到另一个城市,不进行交易的收益为0 第一层的点连向第二层对应的点的边权为-w[i], ...

  9. 洛谷P1073 最优贸易==codevs1173 最优贸易

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

随机推荐

  1. cowboy的中间件

    想不到cowboy这样的,居然也有中间件的概念,膜拜作者 创建工程 rebar-creator create-app testCowboy testCowboy_app.erl -module(tes ...

  2. 学习FPGA过程中的理论知识

    学习FPGA,先要有数电知识,最好有点C语言,,学好硬件描述语言,verilog或者vhdl.在有这些基础上,做一些小的模块不断积累.这里不再赘述. 下面介绍一下关于FPGA学习过程中的一些理论知识. ...

  3. (转)Inno Setup入门(一)——最简单的安装脚本

    本文转载自:http://blog.csdn.net/Augusdi/article/details/8564788 一个最简单的安装脚本: 1.最简单的安装文件脚本: [setup] AppName ...

  4. Solr 6.0 学习(五)solr基本查询和高级查询

    参考:http://www.cnblogs.com/rainbowzc/p/4354224.html 查询参数 常用: q - 查询字符串,必须的. fl - 指定返回那些字段内容,用逗号或空格分隔多 ...

  5. 移动端安装包(APP)的测试用例

    安装 安装手册是否规范,是否简洁,是否通俗易懂. 安装手册是否齐全,正确,有改动时,文档是否同步更新 直接复制安装程序到电脑上,能否正常安装 按安装手册给出的步骤进行安装,安装是否正确 查看在安装过程 ...

  6. 07_java之练习题

    01奇数求和练习 * A: 奇数求和练习 * a: 题目分析 * 为了记录累加和的值,我们需要定义一个存储累加和的变量 * 我们要获取到1-100范围内的数 * 判断当前数是否为奇数,是奇数,完成累加 ...

  7. Octave中调用hist出现broken pipe some output may be lost octave的解决(Mac)

    参考:http://octave.1599824.n4.nabble.com/Mac-OS-X-Mountain-Lion-Octave-can-not-execute-sombrero-td4643 ...

  8. TCP粘包拆包场景

    TCP编程底层都有粘包和拆包机制,因为我们在C/S这种传输模型下,以TCP协议传输的时候,在网络中的byte其实就像是河水,TCP就像一个搬运工,将这流水从一端转送到另一端,这时又分两种情况: 1)如 ...

  9. NetworkStream.write只能使用一次,后面再使用无效

    public delegate void ShowMessageMethod2(TcpClient tc); private void ShowMessage2(TcpClient tc) { Str ...

  10. 「小程序JAVA实战」小程序页面引用外部wxml通用页面(21)

    转自:https://idig8.com/2018/08/09/xiaochengxu-chuji-21/ 现在都是讲究开发的效率,原来单纯的android 和 ios 已经不在吃香了,都是混合开发, ...