先正向从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. JSONUtils的几个常用方法

    1.首先新建1个JSONUtils类 public class JSONUtils { /** * * @author wangwei JSON工具类 * @param * */ /*** * 将Li ...

  2. 软RAID 0的技术概要及实现

    1 什么是RAID,RAID的级别和特点 : 什么是RAID呢?全称是 “A Case for Redundant Arrays of Inexpensive Disks (RAID)”,在1987年 ...

  3. MySql触发器实现数据同步学习

    触发器实现:(增.删.改操作事件触发数据单向同步)数据库触发器教程:https://www.cnblogs.com/phpper/p/7587031.html同步代码: DELIMITER $ DRO ...

  4. 多分类下的ROC曲线和AUC

    本文主要介绍一下多分类下的ROC曲线绘制和AUC计算,并以鸢尾花数据为例,简单用python进行一下说明.如果对ROC和AUC二分类下的概念不是很了解,可以先参考下这篇文章:http://blog.c ...

  5. node操作mongoDB数据库的最基本例子

    连接数据库 var mongo=require("mongodb"); var host="localhost"; var port=mongo.Connect ...

  6. 如何扩大重做日志(redolog)文件的大小

    假设现有三个日志组,每个组内有一个成员,每个成员的大小为1MB,现在想把此三个日志组的成员大小都改为10MB 1.创建2个新的日志组alter database add logfile group 4 ...

  7. Asp.net 的工作原理

     转:http://www.cnblogs.com/linjiancun/archive/2010/09/14/1825662.html 1.1.1          Asp.net 的工作原理 ...

  8. C#条形码生成(五)----Web下的测试

    Html部分 <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server" ...

  9. ruby 功力修炼

    建表 ActiveRecord::Schema.define do drop_table :hosts if table_exists? :hosts create_table :hosts do | ...

  10. Ubuntu 查看磁盘空间大小命令<转>

    df -h Df命令是linux系统以磁盘分区为单位查看文件系统,可以加上参数查看磁盘剩余空间信息,命令格式: df -hl 显示格式为: 文件系统 容量 已用 可用 已用% 挂载点 Filesyst ...