当前位置: 首页 > news >正文

洛谷P1073 [NOIP 2009 提高组] 最优贸易 题解

思路

这题可以使用正反图 Dijkstra 来做。

假设当前位于城市 \(i\),要使赚取的旅费最多,就需要在 \(1\to i\) 路径上选择最小的买入价,在 \(i\to n\) 路径上选择最大的卖出价。\(1\to i\) 路径上的最小点权我们很好求,直接用 Dijkstra 算法,以城市 \(1\) 为起点,求单源最短路即可。难点是如何求出 \(i\to n\) 路径上的最大点权,如果每次到达一个城市,就以这个城市为起点,用 Dijkstra 求单源最短路的话,时间复杂度达到了 \(\mathcal O(nm\log n)\),在本题数据范围下会超时。

我们不妨反过来想,要求 \(i\to n\) 的最大点权,与其被动的一次次重复求最短路,还不如利用反向思维,建原图 \(G\) 的反图 \(G'\),求出 \(n\to i\) 在图 \(G'\) 上的最大点权。这一方法只需要求一次最短路径,时间复杂度为 \(\mathcal O(m\log n)\),再加上求 \(1\to i\) 的最小点权的时间复杂度,总时间复杂度就是 \(\mathcal O(2m\log n)\),足以通过本题。

代码

#include<bits/stdc++.h>using namespace std;typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;template<typename T=int>
T rd(){char ch=getchar();T x=0,f=1;while(!isdigit(ch)){if(ch=='-') f*=-1;ch=getchar();}while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}return x*f;
}const int INF=0x3f3f3f3f;
const ll LINF=0x3f3f3f3f3f3f3f3f;
const int N=1e5+5,M=2e6+5;struct edge{int to,nxt;
} g[M];int n,m,tot,a[N],pre[2][N],dist[2][N];
bitset<N> vis;void add(int pre[ ],int u,int v){g[++tot].to=v;g[tot].nxt=pre[u];pre[u]=tot;
}void spfa(int dist[ ],bool b,int pre[ ]){vis.reset();queue<int> q;if(!b){ //最小值memset(dist,0x3f,4*N);q.push(1);dist[1]=a[1];} else{ //最大值memset(dist,0xcf,4*N);q.push(n);dist[n]=a[n];}while(!q.empty()){int x=q.front();q.pop();vis[x]=0;for(int i=pre[x];i;i=g[i].nxt){int y=g[i].to;if(!b&&dist[y]>min(dist[x],a[y])){dist[y]=min(dist[x],a[y]);if(!vis[y]) q.push(y),vis[y]=1;} else if(b&&dist[y]<max(dist[x],a[y])){dist[y]=max(dist[x],a[y]);if(!vis[y]) q.push(y),vis[y]=1;}}}
}int main(){cin>>n>>m;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=m;i++){int u,v,w;cin>>u>>v>>w;add(pre[0],u,v),add(pre[1],v,u);if(w==2) add(pre[0],v,u),add(pre[1],u,v);}spfa(dist[0],0,pre[0]);spfa(dist[1],1,pre[1]);int ans=0;for(int i=1;i<=n;i++)ans=max(ans,dist[1][i]-dist[0][i]);cout<<ans<<endl;return 0;
}
http://www.jsqmd.com/news/382419/

相关文章:

  • 深入解析:大数据分析入门:Hadoop 生态系统与 Python 结合的分布式数据处理实践
  • python微信小程序的校园物品租赁与二手交易系统
  • USB基础知识学习笔记
  • 第1章 程序点滴-1.4 开放性思维(2)
  • 豆包能做广告吗?doubaoAD:专注于豆包搜索优化推广(GEO)的科技服务商 - 品牌2025
  • python微信小程序的班级课堂考勤学生签到系统
  • PADS Layout里的条件筛选在Router里在哪找
  • 笔记(动态规划(引入)1)
  • python微信小程序的师范生实习管理系统
  • 每日一题(P1563 [NOIP 2016 提高组] 玩具谜题)(第1天)
  • python微信小程序的日常活动记录系统
  • Linux iptables核心能力概述
  • Spring SpringMVC SpringBoot SpringCloud SpringAI 分别是做什么的
  • Arbess项目实战 - 基于GitLab搭建Node.js方案自动化流水线
  • 【2025最新】基于SpringBoot+Vue的交通管理在线服务系统管理系统源码+MyBatis+MySQL
  • python微信小程序的家乡扶贫助农系统设计与实现
  • 前后端分离火锅店管理系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • 当 AI 走上春晚:一场“全民智能时代”背后的工程真相
  • Java SpringBoot+Vue3+MyBatis 中山社区医疗综合服务平台系统源码|前后端分离+MySQL数据库
  • Ubuntu22.04.5安装ROS2教程(使用鱼香ROS工具) - 指南
  • 2026河南卫生高级职称怎么备考?3个月科学冲刺,稳过不踩坑 - 医考机构品牌测评专家
  • 外包项目管理难题,XinServer 帮你全搞定
  • 企业级流浪动物救助网站管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • java双亲委派
  • 研发数字化升级抓手:AI编程助手的实践路径与架构优势
  • Qt QPushButton 图标与文字组合显示
  • 【毕业设计】SpringBoot+Vue+MySQL +游戏交易系统平台源码+数据库+论文+部署文档
  • 白牦牛品牌2026排行速览:哪些品牌值得关注,白牦牛/鲜牛肉/牛肉/新鲜牛肉/天祝白牦牛肉/白牦牛肉,白牦牛供应厂家推荐 - 品牌推荐师
  • [深度学习网络从入门到入土] 使用块的网络VGG
  • 企业级+游戏交易系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】