洛谷 P1073 最优贸易 & [NOIP2009提高组](反向最短路)
传送门
解题思路
很长的题,实际上在一个有向图(点有点权)中求一个从起点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提高组](反向最短路)的更多相关文章
- 洛谷 P1073 最优贸易 解题报告
P1073 最优贸易 题目描述 \(C\)国有\(n\)个大城市和\(m\)条道路,每条道路连接这\(n\)个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这\(m\)条道路中有一部分 ...
- 洛谷P1073 最优贸易==codevs1173 最优贸易
P1073 最优贸易 题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一 ...
- 洛谷 P1073 最优贸易 最短路+SPFA算法
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 题面 题目链接 P1073 最优贸易 题目描述 C国有 $ n $ 个大城市和 ...
- 洛谷——P1073 最优贸易
P1073 最优贸易 n 个城市间以 m 条有向道路连接, 小 T 从 1 号城市出发, 将要去往 n 号城市.小 T 观察到一款商品 Z 在不同的城市的价格可能不尽相同,小 T 想要在旅行中的某一个 ...
- [NOIP2009] 提高组 洛谷P1073 最优贸易
题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分 为双向通行的道路 ...
- 洛谷——P1073 最优贸易 ([NOIP2009] )
https://www.luogu.org/problem/show?pid=1073 题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多 ...
- 洛谷P1073 最优贸易 [图论,DP]
题目传送门 最优贸易 题目描述 C 国有n 个大城市和m 条道路,每条道路连接这n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这m 条道路中有一部分为单向通行的道路,一部分为双向 ...
- 洛谷 P1073 最优贸易
题目描述 CC C 国有 n n n 个大城市和 m mm 条道路,每条道路连接这 nnn 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 mmm 条道路中有一部分为单向通行的道路 ...
- 洛谷P1073最优贸易(跑两遍dij)
题目描述 CC C国有n n n个大城市和m mm 条道路,每条道路连接这 nnn个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 mmm 条道路中有一部分为单向通行的道路,一部分为 ...
随机推荐
- Flask实现分页功能
可以参考: https://blog.csdn.net/weixin_36380516/article/details/80295101 也可以参考我的代码: https://github.com/z ...
- 关于js节流函数throttle和防抖动debounce
废话不多说,直奔主题. 什么是throttle和debounce? 这两个方法的主要目的多是用于性能优化.最常见的应用尝尽就是在通过监听resize.scroll.mouseover等事件时候的性能消 ...
- Pymongodb
首先安装pymongo模块 pip install pymongo 利用Python程序完成增删改查 import pymongo import json from bson import Objec ...
- [每日一讲] Python系列:Python概述
Python 序章 概述 Python 是弱类型动态解释型的面向对象高级语言,其具备面向对象的三大特点:封装.继承.多态.Python 代码运行时,其有一个编译过程,通过编译器生成 .pyc 字节码 ...
- js加密php解密(CryptoJS)碰到的坑
今天做了一个功能,需要js传密码到php文件,对js密码 进行判断,为想为这个传输过程进行解密,参考了网上的一个方法(这个方法我只是使用了,并没有太深了解0.0) 首先要引入3个js文件 (在网上可搜 ...
- [ZJU 1010] Area
ZOJ Problem Set - 1010 Area Time Limit: 2 Seconds Memory Limit: 65536 KB Special Judge Jer ...
- Codeforces Round #579 (Div. 3) 套题 题解
A. Circle of Students 题目:https://codeforces.com/contest/1203/problem/A 题意:一堆人坐成一个环,问能否按逆时针或者顺时针 ...
- Java数据结构之单链表
这篇文章主要讲解了通过java实现单链表的操作,一般我们开始学习链表的时候,都是使用C语言,C语言中我们可以通过结构体来定义节点,但是在Java中,我们没有结构体,我们使用的是通过类来定义我们所需要的 ...
- Java称霸编程语言排行榜
笔者精挑细选了本周研发频道的热门看点,供您在这个周末阅读欣赏.内容涵盖TIOBE编程语言8月份排行榜.开源挑战.WebGL演示.HTML5在线工具.IT职业身涯的14个建议,还有即将举行的SDCC(中 ...
- ORACLE DG在线日志修改
ORACLE DG在线日志修改 SQL>select SEQUENCE#,first_time,next_time,APPLIED, THREAD# from v$archived_log or ...