洛谷 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 条道路中有一部分为单向通行的道路,一部分为 ...
随机推荐
- 使用RAP2模拟假数据实现前后端分离
一.为什么使用RAP2 在一个项目的开发中,在页面需要使用大量数据进行渲染生成前,后端开发人员的接口可能还没有写完, 当前端没有后端数据支持的情况下,我们使用mock.js(mock.js用于生成随机 ...
- PHP环境安全性能检查
PHP环境安全性能检查 PHP在Linux环境下安全配置是一个复杂的过程,其中涉及到很多的细节设置,在这里发出来一个脚本,通过这个脚本来检测你的PHP环境是否存在安全隐患,从而针对这些对你的PHP环境 ...
- linux下安装MySQL(mariadb)
MySQL(mariadb) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可. 开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源 ...
- SQL—事物
[选择题]以下哪个选项是DBMS的基本单位,是构成单一逻辑工作单元的操作集合. A.进程 B.SQL C.事务 D.文件 分析: (1)一个事务包含一个或多个SQL语句,是逻辑管理的工作单元(原子单元 ...
- kubernetes-helm程序包管理器(二十)
helm概述 Helm是Kubernetes的包管理器,Helm 让我们能够像 yum 管理 rpm 包那样安装.部署.升级和删除容器化应用. Helm的核心术语: Chart:一个helm程序包,是 ...
- leetcode-mid-Linked list- 116. Populating Next Right Pointers in Each Node
mycode 93.97% """ # Definition for a Node. class Node(object): def __init__(self, v ...
- centos6最小化安装默认没有 NetworkManager服务
转载Centos6最小化安装中设置网卡默认启动 Centos 6.0版本提供了一个"最小化"(Minimal)安装的选项.这是一个非常好的改进,因为系统中再也不会存在那些不必要 ...
- ORACLE表空间offline谈起,表空间备份恢复
从ORACLE表空间offline谈起,表空间备份恢复将表空间置为offline,可能的原因包括维护.备份恢复等目的:表空间处于offline状态,那么Oracle不会允许任何对该表空间中对象的SQL ...
- MDX 入门
之前用到的SQL,解释:结构化查询语言(Structured Query Language)(发音:/ˈes kjuː ˈel/ "S-Q-L"),是一种特殊目的的编程语言,是一种 ...
- 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_01 Collection集合_3_Collection集合常用功能
Collection在java.util包下面 只学里面几个比较重要的,List和Set 一共7个共性方法 接口指向实现类,多态的形式. 输出这个结合打印出一个空的数组.说明它重写了toString的 ...