news 2026/9/6 6:54:30

《P15803 [GESP202603 七级] 物流网络》

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《P15803 [GESP202603 七级] 物流网络》

题目背景

对应的选择、判断题:试题 - GESP 202603 C++ 七级 - 洛谷有题

题目描述

一个物流网络由 n 个城市和 m 条双向公路组成。每条公路都有两个属性:

  • 运输费用 wi​
  • 景观评分 bi​

当一辆运输车从城市 1 运送货物到城市 n 时,需要支付经过道路的运输费用之和。

为了推广旅游线路,物流公司推出了一项优惠政策:在运输路径上,可以免除景观评分最高的那条公路的运输费用。如果有多条公路的景观评分同为最大值,则只免除其中一条的费用。

请你计算,从城市 1 到城市 n 的最小运输费用。

输入格式

第一行两个整数 n,m,分别表示城市数量和公路数量。

接下来 m 行,每行四个整数 u,v,w,b,表示存在一条连接城市 u 和城市 v 的双向公路,其中 w 为运输费用,b 为景观评分。

输出格式

输出一个整数,表示从城市 1 到城市 n 的最小费用。

如果无法到达,输出-1

输入输出样例

输入 #1复制

3 3 1 2 10 5 2 3 20 6 1 3 100 1

输出 #1复制

0

说明/提示

样例解释

路径 1→2→3:费用 10+20,最大美丽值 6(边 2−3)。免除 20,总花费 10。

路径 1→3:费用 100,最大美丽值 1(边 1−3)。免除 100,总花费 0。

数据范围

1≤n≤5000,1≤m≤5000,1≤w,b≤109。

代码实现:

#include <iostream> #include <vector> #include <queue> #include <algorithm> using namespace std; typedef long long ll; typedef pair<ll,int> pli; const ll INF = 1e18; struct RawEdge{ int u,v; ll w,b; }; struct Edge{ int to; ll w; }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n,m; cin >> n >> m; vector<RawEdge> es(m); for(int i=0;i<m;i++) { cin >> es[i].u >> es[i].v >> es[i].w >> es[i].b; } sort(es.begin(),es.end(),[](const RawEdge &a,const RawEdge &b){ return a.b < b.b; }); vector<vector<Edge>> g(n+1); ll ans = INF; vector<ll> dist1(n+1,INF), distn(n+1,INF); priority_queue<pli,vector<pli>,greater<pli>> q; auto dijk = [&](int s, vector<ll>&d) { fill(d.begin(),d.end(),INF); d[s]=0; q.push({0,s}); while(!q.empty()) { auto [dis,u]=q.top(); q.pop(); if(dis>d[u])continue; for(auto &e:g[u]) { int v=e.to; ll w=e.w; if(d[v]>d[u]+w) { d[v]=d[u]+w; q.push({d[v],v}); } } } }; int ptr=0; while(ptr<m) { int curB = es[ptr].b; int nxt=ptr; vector<RawEdge> batch; while(nxt<m && es[nxt].b == curB) { batch.push_back(es[nxt]); nxt++; } for(int i=ptr;i<nxt;i++) { int u=es[i].u,v=es[i].v; ll w=es[i].w; g[u].push_back({v,w}); g[v].push_back({u,w}); } ptr = nxt; dijk(1,dist1); dijk(n,distn); for(auto &e : batch) { int u=e.u, v=e.v; ll w=e.w; ll cost1 = dist1[u] + distn[v]; ll cost2 = dist1[v] + distn[u]; ll total = min(cost1,cost2); if(total < ans) ans = total; } } dijk(1,dist1); ans = min(ans, dist1[n]); if(ans >= INF) cout << -1 << endl; else cout << ans << endl; return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/6 6:53:31

提示词缓存如何让LLM推理成本直降36%?原理与工程落地

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/6 6:52:39

AgentMesh实战:AI Agent微服务架构中的状态管理与工具编排

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/6 6:51:38

YOLOv8+PyQt5密集人群人体检测计数系统设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/6 6:51:27

技术团队协作规范:代码质量与自动化工具实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/6 6:47:37

计算机毕业设计选题推荐:基于spring boot的教育学习平台、毕业设计选题、计算机毕设、选题推荐、毕设指导、项目定制、源码、高质量项目

&#x1f496;&#x1f496;作者&#xff1a;计算机编程小咖 &#x1f499;&#x1f499;个人简介&#xff1a;曾长期从事计算机专业培训教学&#xff0c;本人也热爱上课教学&#xff0c;语言擅长Java、微信小程序、Python、Golang、安卓Android等&#xff0c;开发项目包括大数…

作者头像 李华
网站建设 2026/9/6 6:46:05

【java】程序逻辑控制

顺序结构顺序结构&#xff1a;程序按照代码书写的先后顺序&#xff0c;从上到下逐行依次执行&#xff0c;没有跳转、没有分支写在前面的代码先执行&#xff0c;写在后面的后执行 System.out.println("aaa");System.out.println("bbb");System.out.println(…

作者头像 李华