洛谷P1073最优贸易——双向取值
题目:https://www.luogu.org/problemnew/show/P1073
由于任何城市都可以多次经过,所以可以随便走,也就不用太在意有向边和无向边,把无向边当做两条有向边处理;
根据题意,价格较小的城市要先于价格较大的城市被经过,然而它又可以随便走,所以不妨分开考虑;
每个点维护两个值,一个是从起点到它的最小值,一个是从终点到它的最大值,在每个城市的二者之差中取MAX即可;
于是问题转化为求两个单源最短路,对于终点出发的那个,将边全部反向进行最短路即可。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
priority_queue< pair<int,int> >q;
int const MAXN=1e5+,MAXM=5e5+;
int n,m,head[MAXN],ct,s[MAXN],t[MAXN],head2[MAXN],ct2,cost[MAXN],ans;
bool vis[MAXN];
struct N{
int to,next;
N(int t=,int n=):to(t),next(n) {}
}edge[MAXM],edge2[MAXM];
void add(int x,int y,int z)
{
edge[++ct]=N(y,head[x]);head[x]=ct;
edge2[++ct2]=N(x,head2[y]);head2[y]=ct;
if(z==)
{
edge[++ct]=N(x,head[y]);head[y]=ct;
edge2[++ct2]=N(y,head2[x]);head2[x]=ct;
}
}
void dijkstra1()
{
while(q.size())q.pop();
memset(s,0x3f,sizeof s);
memset(vis,,sizeof vis);
s[]=cost[];q.push(make_pair(-cost[],));//大根堆
while(q.size())
{
int x=q.top().second;q.pop();
if(vis[x])continue;//!
vis[x]=;
for(int i=head[x],u;i;i=edge[i].next)
if(s[u=edge[i].to]>min(s[x],cost[u]))
{
s[u]=min(s[x],cost[u]);
q.push(make_pair(-s[u],u));
}
}
}
void dijkstra2()
{
while(q.size())q.pop();
memset(t,-,sizeof t);
memset(vis,,sizeof vis);
t[n]=cost[n];q.push(make_pair(cost[n],n));//大根堆
while(q.size())
{
int x=q.top().second;q.pop();
if(vis[x])continue;//!
vis[x]=;
for(int i=head2[x],u;i;i=edge2[i].next)
if(t[u=edge2[i].to]<max(t[x],cost[u]))
{
t[u]=max(t[x],cost[u]);
q.push(make_pair(t[u],u));
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&cost[i]);
for(int i=,x,y,z;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
dijkstra1();
dijkstra2();
for(int i=;i<=n;i++)
ans=max(ans,t[i]-s[i]);
printf("%d",ans);
return ;
}
洛谷P1073最优贸易——双向取值的更多相关文章
- 洛谷 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 最优贸易 最短路+SPFA算法
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 题面 题目链接 P1073 最优贸易 题目描述 C国有 $ n $ 个大城市和 ...
- 洛谷P1073 最优贸易 [图论,DP]
题目传送门 最优贸易 题目描述 C 国有n 个大城市和m 条道路,每条道路连接这n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这m 条道路中有一部分为单向通行的道路,一部分为双向 ...
- 洛谷 P1073 最优贸易 & [NOIP2009提高组](反向最短路)
传送门 解题思路 很长的题,实际上在一个有向图(点有点权)中求一个从起点1到终点n的路径,使得这条路径上点权最大的点与点权最小的点的差值最大(要求必须从点权较小的点能够走到点权较大的点). ——最短路 ...
- 洛谷 P1073 最优贸易
题目描述 CC C 国有 n n n 个大城市和 m mm 条道路,每条道路连接这 nnn 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 mmm 条道路中有一部分为单向通行的道路 ...
- [NOIP2009] 提高组 洛谷P1073 最优贸易
题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分 为双向通行的道路 ...
- NOIP2009 codevs1173 洛谷P1073 最优贸易
Description: 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通 ...
随机推荐
- basePath 方便
String path = request.getContextPath()+"/";String basePath = request.getScheme() + ": ...
- Android MPAndroidCharts 框架 画可滑动查看的直方图
1.由于公司项目的需求,所以花了1.2天研究 MPAndroidCharts框架 .可是发现好多博客对我都没得帮助.浪费非常多时间在百度上.不得不说google 真是比百度强太多了. 要求:统计出56 ...
- sql分级汇总
--測试数据 create table tb([DB-ID] varchar(10),ENTITY varchar(10),DATE varchar(10),[CUST-NO] int,AMOUNT ...
- 高速创建和mysql表相应的java domain实体类
今天创建了一个表有十几个字段,创建完之后必定要写一个与之相应的java domain实体类. 这不是反复的工作吗?为什么不先把这个表的全部的字段查出来,然后放到linux环境下,用sed工具在每一行的 ...
- MySQL:unknown variable 'master-host=masterIP' [ERROR] Aborting
<span style="font-size:18px;">120401 15:45:44 [ERROR] C:\Program Files\MySQL\MySQL S ...
- 递归计算战士打靶S次打了N环一共同拥有多少种可能的问题
问题描写叙述 一个战士打了10次靶.一共打了90环,问一共同拥有多少种可能,并输出这些可能的组合. 思路 首先.嵌套10层循环进行穷举是不可取的,一是由于速度太慢,二是假设改成打20次靶就完蛋了. 事 ...
- class中的私有属性的访问
在类中的私有属性设置: class Name(): __init__(self): self.__name = 'arnol'` 如何查看: 1,在类中定义一个方法: def getname(self ...
- ArrayList概述
一. ArrayList概述: ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境 ...
- maven的基本原理和使用
一.Maven中央存储库 当你建立一个 Maven 的项目,Maven 会检查你的 pom.xml 文件,以确定哪些依赖下载.首先,Maven 将从本地资源库获得 Maven 的本地资源库依赖资源,如 ...
- RabbitMQ 基础
Windows下安装RabbitMq 下载RabbitMq 安装参考 http://www.rabbitmq.com/install-windows.html 下载Erlang Erlang 下载安装 ...