洛谷P1073最优贸易(跑两遍dij)
题目描述
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。
输入输出样例
5 5
4 3 5 6 1
1 2 1
1 4 1
2 3 2
3 5 1
4 5 2
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)的更多相关文章
- 洛谷 P1073 最优贸易 最短路+SPFA算法
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 题面 题目链接 P1073 最优贸易 题目描述 C国有 $ n $ 个大城市和 ...
- 洛谷 P1073 最优贸易 解题报告
P1073 最优贸易 题目描述 \(C\)国有\(n\)个大城市和\(m\)条道路,每条道路连接这\(n\)个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这\(m\)条道路中有一部分 ...
- 洛谷P1073 最优贸易==codevs1173 最优贸易
P1073 最优贸易 题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一 ...
- 洛谷——P1073 最优贸易
P1073 最优贸易 n 个城市间以 m 条有向道路连接, 小 T 从 1 号城市出发, 将要去往 n 号城市.小 T 观察到一款商品 Z 在不同的城市的价格可能不尽相同,小 T 想要在旅行中的某一个 ...
- 洛谷P1073 最优贸易 [图论,DP]
题目传送门 最优贸易 题目描述 C 国有n 个大城市和m 条道路,每条道路连接这n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这m 条道路中有一部分为单向通行的道路,一部分为双向 ...
- 洛谷 P1073 最优贸易 & [NOIP2009提高组](反向最短路)
传送门 解题思路 很长的题,实际上在一个有向图(点有点权)中求一个从起点1到终点n的路径,使得这条路径上点权最大的点与点权最小的点的差值最大(要求必须从点权较小的点能够走到点权较大的点). ——最短路 ...
- 洛谷P1073 最优贸易
题面要求的是一个差值,即走过一条路径能找到的路径上最大值-最小值. 那么相当于跑一遍最长路和一遍最短路,当然不是概念上的最长路最短路,这里把dis[v]的松弛改成用路径上传递来的最大/最小值维护,而不 ...
- 洛谷 P1073 最优贸易 题解
题面 大家都是两遍SPFA吗?我这里就一遍dp啊: 首先判断对于一个点u,是否可以从一号点走到这里,并且可以从u走到n号点: 对于这样的点我们打上标记: 那么抛出水晶球的点一定是从打上标记的点中选出一 ...
- NOIP2009 codevs1173 洛谷P1073 最优贸易
Description: 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通 ...
随机推荐
- 转:unittest的几种运行方式
#unittest-test.py import unittestfrom demo import RunMainimport HtmlTestRunner class TestMethod(unit ...
- 【C语言】请输入一个n(n<=10)并输出一个n行n列的杨辉三角
应用二维数组的知识 杨辉三角特点: 1.第一列和对角线的元素全部为1 2.其他元素等于上一行的当前列的值和上一行中当前列前边一列的值之和 #include<stdio.h> #define ...
- 2018-2019-20175334实验三《敏捷开发与XP实践》实验报告
2018-2019-20175334实验三<敏捷开发与XP实践>实验报告 一.实验内容及步骤 实验三 敏捷开发与XP实践-1 实验三 敏捷开发与XP实践 http://www.cnblog ...
- Unity相机跟随
固定相机跟随 这种相机有一个参考对象,它会保持与该参考对象固定的位置,跟随改参考对象发生移动 using UnityEngine; using System.Collections; public c ...
- 安装k8s出现 Failed to list *api.Node: Get http://192.168.144.131:8080...: dial tcp 192.168.144.131:8080: getsockopt: no route to
原因是master主机的防火墙没关,导致无法访问主机的8080端口,解决方法暂时关闭主机上的防火墙. * centos6 : service iptables stop * centos7 : sys ...
- css的理解 ----footrt固定在底部
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 普及C组第二题(8.5)
1565. [GDKOI]神秘山庄 (Standard IO) 时间限制: 1000 ms 空间限制: 262144 KB 题目: 翠亨村是一个神秘的山庄,并不是因为它孕育了伟人孙中山,更神秘的是山 ...
- 7_6 带宽(UVa140)<回溯法:最优性剪枝>
给定一个图(V,E),其中V为顶点的集合,E为边的集合,属于VxV.给定V中元素的一种排序,那么顶点v的带宽定义如下:在当前给定的排序中,与v距离最远的且与v有边相连的顶点与v的距离.给定排序的带宽定 ...
- vue使用axios访问后台接口
链接1:https://segmentfault.com/a/1190000012635783#item-2 // axios 使用post方式传递参数,后端接受不到,怎么解决 链接2:http ...
- cordova的安装与配置
1.安装nodejs(自动包含npm) 2.在命令行中通过npm语句npm install -g cordova 安装cordova(如果提示网络连接失败,需要设置网络代理,搭理网址:npm conf ...