题目描述

CC C国有n n n个大城市和m mm 条道路,每条道路连接这 nnn个城市中的某两个城市。任意两个城市之间最多只有一条道路直接相连。这 mmm 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道路在统计条数时也计为 11 1条。

CC C国幅员辽阔,各地的资源分布情况各不相同,这就导致了同一种商品在不同城市的价格不一定相同。但是,同一种商品在同一个城市的买入价和卖出价始终是相同的。

商人阿龙来到 CCC 国旅游。当他得知同一种商品在不同城市的价格可能会不同这一信息之后,便决定在旅游的同时,利用商品在不同城市中的差价赚回一点旅费。设 CCC 国 n 个城市的标号从 1 n1~ n1 n,阿龙决定从 11 1号城市出发,并最终在 nnn 号城市结束自己的旅行。在旅游的过程中,任何城市可以重复经过多次,但不要求经过所有 nnn 个城市。阿龙通过这样的贸易方式赚取旅费:他会选择一个经过的城市买入他最喜欢的商品――水晶球,并在之后经过的另一个城市卖出这个水晶球,用赚取的差价当做旅费。由于阿龙主要是来 CCC 国旅游,他决定这个贸易只进行最多一次,当然,在赚不到差价的情况下他就无需进行贸易。

假设 CC C国有 555个大城市,城市的编号和道路连接情况如下图,单向箭头表示这条道路为单向通行,双向箭头表示这条道路为双向通行。

假设 1 n1~n1 n 号城市的水晶球价格分别为 4,3,5,6,14,3,5,6,14,3,5,6,1。

阿龙可以选择如下一条线路:111->222->333->555,并在 22 2号城市以3 33 的价格买入水晶球,在 333号城市以5 5 5的价格卖出水晶球,赚取的旅费数为 2。

阿龙也可以选择如下一条线路1 11->444->555->444->555,并在第11 1次到达5 55 号城市时以 11 1的价格买入水晶球,在第 222 次到达4 44 号城市时以6 66 的价格卖出水晶球,赚取的旅费数为5 55。

现在给出 nn n个城市的水晶球价格,mmm 条道路的信息(每条道路所连接的两个城市的编号以及该条道路的通行情况)。请你告诉阿龙,他最多能赚取多少旅费。

输入格式

第一行包含 222 个正整数n n n和 mmm,中间用一个空格隔开,分别表示城市的数目和道路的数目。

第二行 n 个正整数,每两个整数之间用一个空格隔开,按标号顺序分别表示这 n 个城市的商品价格。

接下来 mmm 行,每行有3 3 3个正整数x,y,zx,y,zx,y,z,每两个整数之间用一个空格隔开。如果 z=1z=1z=1,表示这条道路是城市x x x到城市y y y之间的单向道路;如果z=2 z=2z=2,表示这条道路为城市 xx x和城市yy y之间的双向道路。

输出格式

一 个整数,表示最多能赚取的旅费。如果没有进行贸易,则输出 000。

输入输出样例

输入 #1

5 5
4 3 5 6 1
1 2 1
1 4 1
2 3 2
3 5 1
4 5 2
输出 #1

5

说明/提示

【数据范围】

输入数据保证 111 号城市可以到达n n n号城市。

对于 10%的数据,1≤n≤61≤n≤61≤n≤6。

对于 30%的数据,1≤n≤1001≤n≤1001≤n≤100。

对于 50%的数据,不存在一条旅游路线,可以从一个城市出发,再回到这个城市。

对于 100%的数据,1≤n≤1000001≤n≤1000001≤n≤100000,1≤m≤5000001≤m≤5000001≤m≤500000,1≤x1≤x1≤x,y≤ny≤ny≤n,1≤z≤21≤z≤21≤z≤2,1≤1≤1≤各城市

水晶球价格≤100≤100≤100。

NOIP 2009 提高组 第三题

将双向边存储为两条单向边,建一张原图一张反图,跑两边dijkstra(或者spfa)。第一遍求数组d,d[x]表示从1到x的所有路径中经过的权值最小的节点的权值。 第二遍求数组d1,d1[x]表示从n到x的所有路径中经过的权值最大的节点的权值(由单源最短路的求法可知,只能由确定的点n开始,所以必须建反图求)。   然后遍历节点,ans=max(ans,d1[i]-d[i])更新答案。

#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <bits/stdc++.h>
using namespace std;
const int N=;
const int M=;
int head[N],ver[M],Next[M],d[N];bool v[N];
int head1[N],ver1[M],Next1[M],d1[N];bool v1[N];
int price[N];
int n,m,tot=,tot1=;
void add(int x,int y)
{
ver[++tot]=y;
Next[tot]=head[x];
head[x]=tot;
}
void add1(int x,int y)
{
ver1[++tot1]=y;
Next1[tot1]=head1[x];
head1[x]=tot1;
}
priority_queue< pair<int,int> >q;
priority_queue< pair<int,int> >q1;
void dij()
{
memset(d,0x3f,sizeof(d));
memset(v,,sizeof(v));
d[]=price[];//一定要注意初始化!!!!!!!!! 千万不能加v[1]=1;!!!!!!
q.push(make_pair(price[],));
while(q.size())
{
int x=q.top().second;q.pop();
if(v[x])continue;
v[x]=;
int i;
for(i=head[x];i;i=Next[i])
{
int y=ver[i];
d[y]=min(d[x],price[y]);
q.push(make_pair(d[y],y));
}
}
}
void dij1()
{
memset(d1,-0x3f,sizeof(d1));//初始化为负无穷
memset(v1,,sizeof(v1));
d1[n]=price[n];//v1[n]=1;//千万不能加这一条
q1.push(make_pair(price[n],n));
while(q1.size())
{
int x=q1.top().second;q1.pop();
if(v1[x])continue;
v1[x]=;
int i;
for(i=head1[x];i;i=Next1[i])
{
int y=ver1[i];
d1[y]=max(d1[x],price[y]);
q1.push(make_pair(d1[y],y));
}
}
}
int main()
{
cin>>n>>m;
int i;
for(i=;i<=n;i++)
{
scanf("%d",&price[i]);
}
for(i=;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
if(z==)
{
add(x,y);
add1(y,x);
}
else
{
add(x,y);add(y,x);
add1(x,y);add1(y,x);
}
}
dij();
dij1();
int ans=;
for(i=;i<=n;i++)
{
ans=max(ans,d1[i]-d[i]);
}
cout<<ans;
return ;
}

洛谷P1073最优贸易(跑两遍dij)的更多相关文章

  1. 洛谷 P1073 最优贸易 最短路+SPFA算法

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 题面 题目链接 P1073 最优贸易 题目描述 C国有 $ n $ 个大城市和 ...

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

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

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

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

  4. 洛谷——P1073 最优贸易

    P1073 最优贸易 n 个城市间以 m 条有向道路连接, 小 T 从 1 号城市出发, 将要去往 n 号城市.小 T 观察到一款商品 Z 在不同的城市的价格可能不尽相同,小 T 想要在旅行中的某一个 ...

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

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

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

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

  7. 洛谷P1073 最优贸易

    题面要求的是一个差值,即走过一条路径能找到的路径上最大值-最小值. 那么相当于跑一遍最长路和一遍最短路,当然不是概念上的最长路最短路,这里把dis[v]的松弛改成用路径上传递来的最大/最小值维护,而不 ...

  8. 洛谷 P1073 最优贸易 题解

    题面 大家都是两遍SPFA吗?我这里就一遍dp啊: 首先判断对于一个点u,是否可以从一号点走到这里,并且可以从u走到n号点: 对于这样的点我们打上标记: 那么抛出水晶球的点一定是从打上标记的点中选出一 ...

  9. NOIP2009 codevs1173 洛谷P1073 最优贸易

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

随机推荐

  1. emoji大全_如何明智地使用emoji: &#128516;

    官网 https://www.webfx.com/tools/emoji-cheat-sheet/ emoji那么多,如何准确地使用到自己想要到呢?

  2. 【Python】计算圆的面积

    代码: r=29 area = 3.1415*r*r print(area) print("{:.2f}".format(area)) 结果:

  3. window10配置远程虚拟机window7上的mysql5.7数据源

    原文链接:http://www.xitongcheng.com/jiaocheng/win10_article_18644.html windows10系统用户想要在电脑中设置ODBC数据源,于是手动 ...

  4. python-第三方库的理解及某个函数的源代码

    第三方库,是一个总称,里面有各个模块,而具体使用的函数是模块里的. 库包含多个模块, 每个模块里包含多个函数. import AAAA     就是引用AAAA这个库,这个库里的模块函数都可以用,只是 ...

  5. 可以使用的一些API(转存)

    聚合数据 juhe.com 转存的格式不如原文的好看,可以直接访问原文 https://www.jianshu.com/p/9a0acf69b789 api接口应该会越来越火,上个全的,楼主自己找找吧 ...

  6. Gym安装ubuntu16.04

    Step1:将gym克隆到计算机上: git clone https://github.com/openai/gym.git 如果你的电脑没有安装git,那么键入 sudo apt install g ...

  7. if a != None:

    >>> x = 1 >>> not x False >>> x = [1] >>> not x False >>&g ...

  8. Permission denied 解决办法

    Permission denied 解决的办法: $ sudo chmod -R 777 某一目录 其中-R 是指级联应用到目录里的所有子目录和文件777 是所有用户都拥有最高权限

  9. golang采坑记录

    安装golang,引入第三方库,采坑 1.获取安装包 go语言中文网:https://studygolang.com/dl 官网地址:https://studygolang.com/dl 2.下载 选 ...

  10. 【代码总结】Struts2 Action接受参数方式的对比

    一.属性方式 1.Action中:对应表单参数的setter.getter 2.页面中  :Form中元素name取值属性名 <s:property value="属性名" ...