洛谷 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 条道路中有一部分为单向通行的道路,一部分为 ...
随机推荐
- 带加载进度的Web图片懒加载组件Lazyload
在Web项目中,大量的图片应用会导致页面加载时间过长,浪费不必要的带宽成本,还会影响用户浏览体验. Lazyload 是一个文件大小仅4kb的图片懒加载组件(不依赖其它第三方库),组件会根据用户当前浏 ...
- C++ GUI Qt4学习笔记07
C++ GUI Qt4 qtc++scrollobject编程 事件(event)是由串口系统或者Qt自身产生的,用以响应所发生的各类事情.当用户按下或者松开键盘或者鼠标上的按键时,就可以产生一个 ...
- HTTP content-type及POST提交数据方式
Content-Type(内容类型),一般指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式.什么编码读取这个文件,这也是一些网页点击的结果却是一个文件 ...
- SonarQube规则之漏洞类型
漏洞类型: 1."@RequestMapping" methods should be "public"漏洞 阻断标注了RequestMapping是contr ...
- Java——容器
[容器API] <1>J2SDK所提供的容器位于java.util包内.
- 【翻译】详解HTML5 自定义 Data 属性
原标题:HTML5 Custom Data Attributes (data-*) 你是否曾经使用 class 或 rel 来保存任意的元数据,只为了使你的JavaScript更简单?如果你回答是的, ...
- three arrays
three arrays 字典树上贪心 #include<bits/stdc++.h> using namespace std; ][][]; ][]; ]; ]; ][]; ][]; i ...
- which statement is true for the class java.util.ArrayList?
A.集合中的元素是有序的 对 B.集合被保证为不可变的 错 C.集合中的元素被保证为唯一的 错 有序的 所以不唯一 D.集合中的元素使用一个唯一的键来存取 错 没有键 E.集合中的元 ...
- es之IK分词器
1:默认的分析器-- standard 使用默认的分词器 curl -XGET 'http://hadoop01:9200/_analyze?pretty&analyzer=standard' ...
- 转: Github上关于iOS的各种开源项目集合
https://blog.csdn.net/jiashaoying/article/details/79079500 下拉刷新 EGOTableViewPullRefresh - 最早的下拉刷新控件. ...