洛谷 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 条道路中有一部分为单向通行的道路,一部分为 ...
随机推荐
- fs.mkdir
fs.mkdir(path[, mode], callback) 要求父目录必须存在 let fs = require('fs'); fs.mkdir('./c/b/a', res=>{ // ...
- YNOI2016:掉进兔子洞 (莫队+bitset)
YNOI2016:掉进兔子洞 题意简述: 有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间剩下的数的个数和,询问独立. 注意这里删掉指的是一个一个删,不是把等于这 ...
- Thymeleaf静态资源引入方式及公共页面代码抽取
静态资源引入 Thymeleaf模板引擎url问题,要用如下的方式写,确保在任何情况下都能访问到 <!-- Bootstrap core CSS --> <link href=&qu ...
- koa2基础
1.安装脚手架 npm install -g koa-generator 2.创建目录 koa2 -e koa2-learn 3.cd koa2-learn 4.npm install 5.SET D ...
- java生成图片验证码(转)--封装生成图片验证码的工具类
博客部分内容转载自 LonlySnow的博客:后台java 实现验证码生成 1.controller方法 @RequestMapping(value = "/verifycode/img&q ...
- HDU 4758 Walk Through Squares ( Trie图 && 状压DP && 数量限制类型 )
题意 : 给出一个 n 行.m 列的方格图,现从图左上角(0, 0) 到右下角的 (n, m)走出一个字符串(规定只能往下或者往右走),向右走代表' R ' 向下走则是代表 ' D ' 最后从左上角到 ...
- 对拍程序 x
一.介绍 在做题或者正式比赛过程中总会把水题做水做乱,但因为样例有坑所以直接过了样例,然后拿去评测结果发现全WA.那如何在这种情况下检查自己程序或算法的正确性呢?对拍是一个简便省事的方案. 所谓“对拍 ...
- Maven的settings.xml配置详解
子节点详细介绍转载:http://www.cnblogs.com/jingmoxukong/p/6050172.html?utm_source=gold_browser_extension 全局配置 ...
- 【BZOJ1132】Tro(叉积)
题意:平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 N个点的坐标,其值在[0,10000] 思路:按从左到右的预处理点排序 每次枚举最左点作为原点,把叉积从大到小排 ...
- 【CF1236D】Alice and the Doll(set)
题意:给定一个n*m的网格,其中k格有障碍 周驿东从(1,1)出发面朝右,每次行动前他可以选择顺时针旋转90度或不旋转,然后向自己朝向的位置走1格 问他能否不重复不遗漏的走过所有非障碍格 n,m,k& ...