传送门


解题思路

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

——最短路??

——不像呀。

(可是洛谷标签上写着呀)

就是一个写起来像最短路的一个图中的dp。

我们用dis1[i]表示从1号点到第i号点的路径上的最小值,用dis2[i]表示从i号点到第n号点的最大值,最后只需要找出最大的(dis2[i]-dis1[i])即可。

怎么求dis2呢?这里有一种方法——建反图。

建反图就是把每一条有向边反过来,例如原来是u-->v,现在变成了v-->u。

然后从n开始,跑一遍n到各个点的最短路,求出dis2数组。

对于dis数组,dis[i的儿子k]=dis[i],v[k](k号点本身的数值),dis[k]中的最小值/最大值。

用dijkstra或者spfa跑一遍图就可以了。

当年,spfa还没有死去。

AC代码

 #include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=;
const int maxm=;//注意有可能是双向边,所以要开两倍的数组。
int n,m,p1[maxn],p2[maxn],cnt1,cnt2,vis[maxn],dis1[maxn],dis2[maxn],ans,v[maxn];
struct edge{
int v,next;
}e1[maxm],e2[maxm]; //两个图
void insert1(int u,int v){ //两个insert
cnt1++;
e1[cnt1].v=v;
e1[cnt1].next=p1[u];
p1[u]=cnt1;
}
void insert2(int u,int v){
cnt2++;
e2[cnt2].v=v;
e2[cnt2].next=p2[u];
p2[u]=cnt2;
}
struct node{
int num,len;
};
bool operator < (node a,node b){
return a.len>b.len;
}
priority_queue<node> q1,q2;
void dijkstra1(){ //两个dijkstra
memset(vis,,sizeof(vis));
memset(dis1,0x3f,sizeof(dis1));
dis1[]=v[];
node nd;
nd.len=v[];
nd.num=;
q1.push(nd);
while(!q1.empty()){
node u=q1.top();
q1.pop();
if(vis[u.num]) continue;
vis[u.num]=;
for(int i=p1[u.num];i!=-;i=e1[i].next){
dis1[e1[i].v]=min(min(dis1[e1[i].v],u.len),v[e1[i].v]);//算是个小的dp吧
node xin;
xin.num=e1[i].v;
xin.len=dis1[e1[i].v];
q1.push(xin);
}
}
}
void dijkstra2(){
memset(vis,,sizeof(vis));
memset(dis2,-0x3f,sizeof(dis2));
dis2[n]=v[n];
node nd;
nd.len=v[n];
nd.num=n;
q2.push(nd);
while(!q2.empty()){
node u=q2.top();
q2.pop();
if(vis[u.num]) continue;
vis[u.num]=;
for(int i=p2[u.num];i!=-;i=e2[i].next){
dis2[e2[i].v]=max(max(dis2[e2[i].v],u.len),v[e2[i].v]);
node xin;
xin.num=e2[i].v;
xin.len=dis2[e2[i].v];
q2.push(xin);
}
}
}
int main(){
cin>>n>>m;
memset(p1,-,sizeof(p1));
memset(p2,-,sizeof(p2));
for(int i=;i<=n;i++) cin>>v[i];
for(int i=;i<=m;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
if(z==){
insert1(x,y);
insert2(y,x);
}else{
insert1(x,y);
insert1(y,x);
insert2(x,y);
insert2(y,x);
}
}
dijkstra1();
dijkstra2();
for(int i=;i<=n;i++) ans=max(ans,dis2[i]-dis1[i]);//求出答案
cout<<ans;
return ;
}

//NOIP2009提高组t3

//好困啊,zzz

洛谷 P1073 最优贸易 & [NOIP2009提高组](反向最短路)的更多相关文章

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

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

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

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

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

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

  4. 洛谷——P1073 最优贸易

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

  5. [NOIP2009] 提高组 洛谷P1073 最优贸易

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

  6. 洛谷——P1073 最优贸易 ([NOIP2009] )

    https://www.luogu.org/problem/show?pid=1073 题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多 ...

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

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

  8. 洛谷 P1073 最优贸易

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

  9. 洛谷P1073最优贸易(跑两遍dij)

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

随机推荐

  1. Attention Points

    Attention Points 数组范围 无向图.树,边表的范围是边数的两倍. 因为最近树的题目做的比较多,一定要注意分清是树还是图,不能冲上去就去开struct Edge{int to,ne,w; ...

  2. django搭建一个小型的服务器运维网站-查看服务器中的日志与前端的datatable的利用

    目录 项目介绍和源码: 拿来即用的bootstrap模板: 服务器SSH服务配置与python中paramiko的使用: 用户登陆与session; 最简单的实践之修改服务器时间: 查看和修改服务器配 ...

  3. 转 Java中final、finally、finalize的区别与用法

    Java中final.finally.finalize的区别与用法   1.简单区别:final用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可继承.finally是异常处理语句结构 ...

  4. Python内置函数之filter map reduce

    Python内置函数之filter map reduce 2013-06-04 Posted by yeho Python内置了一些非常有趣.有用的函数,如:filter.map.reduce,都是对 ...

  5. SpringCloud创建Eureka

    Eureka是什么 Eureka是Netflix的一 个子模块,也是核心模块之一- .Eureka是一 个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移.服务注册与发现对于微服务 ...

  6. react native 之 在现有的iOS工程中集成react native

    在现有的iOS工程中集成react native, 或者说将react native引入到iOS 项目,是RN和iOS混合开发的必经之路 参考官网教程:https://reactnative.cn/d ...

  7. Headless Windows

    Google Chrome 79.0.3945.79 (正式版本) (64 位) (cohort: 79_Win_79) .\chrome --headless --user-data-dir=tmp ...

  8. 跳转控制语句continue

    1 continue的使用场景: 1.1 在循环语句中 注意:离开使用场景的存在是没有意义的 2 continue的作用: 2.1 单层循环对比break,然后总结两者的区别 2.1.1 break ...

  9. C++ 对象间通信框架 V2.0 ××××××× 之(二)

    公共头文件:ss_type_def.h ================================================================================ ...

  10. grep的用法,小技巧,模板中含有\t时:grep -P "^\t" file

    linux中grep和find的用法区别 本文章详细的介绍了关于在linux中的grep和find两个命令的用法介绍,以及后面总结了它们两年用法区别哦. 先我们来介绍一下关于grep用法和一些小注意事 ...