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

TRVCOST - Travelling cost 题解

题面

题目描述

Spojland 政府在城市中规划了一些地点,准备建设道路。

输入格式

第一行是一个整数 \(N\),表示政府计划修建的道路数量。

接下来有 \(N\) 行,每行包含三个整数 \(A\)\(B\)\(W\)。其中,\(A\)\(B\) 是修路连接的两个地点,\(W\) 是从 \(A\)\(B\) 或从 \(B\)\(A\) 的固定旅行费用。

再接下来的一行包含一个整数 \(U\),Rohit 希望从该地点出发,去往其他地方。

随后一行包含一个整数 \(Q\),代表他想要执行的查询次数,用于查找旅行费用。

接下来的 \(Q\) 行,每行包含一个整数 \(V\)(目的地),需要计算从 \(U\) 前往 \(V\) 的最低花费。

输出格式

对于每个查询,输出一行结果。如果无法从地点 \(U\) 到达地点 \(V\),则输出 'NO PATH'。

输入输出样例 #1

输入 #1

7
0 1 4
0 3 8
1 4 1
1 2 2
4 2 3
2 5 3
3 4 2
0
4
1
4
5
7

输出 #1

4
5
9
NO PATH

说明/提示

  • \(1 \le N \le 10^5\)
  • \(1 \le A, B \le 10^5\)
  • \(1 \le W \le 10^9\)
  • \(1 \le U \le 10^5\)
  • \(1 \le Q \le 10^5\)
  • \(1 \le V \le 10^5\)

本翻译由 AI 自动生成

题解

题目分析

很明显,这是一道单源最短路的题,可以使用 Dijkstra 来做这道题(如果是骗分的也可以试试 Floyd),而且还可以说这就是一道 Dijkstra 的版子。

接下来我将会简单说一下 Dijkstra。

Dijkstra

这个算法可以简单概括为“Dijkstra = BFS + 贪心”,大体步骤如下:

步骤 做法 具体操作 结果
\(1\) 从起点 \(s\) 出发,用 BFS 扩展它的邻居节点 把这些邻居点放到一个集合 \(A\) 中,并记录这些点到 \(s\) 的距离
\(2\) 选择距离 \(s\) 最近的邻居 \(v\),继续用 BFS 扩展 \(v\) 的邻居 首先在 \(A\) 中找到距离 \(s\) 最小的点 \(v\),把 \(v\) 的邻居点放到 \(A\) 中;如果 \(v\) 的邻居经过 \(v\) 中转,到 \(s\) 的距离更短,则更新这些邻居到 \(s\) 的距离;最后从集合 \(A\) 中移走 \(v\),后面不再处理 \(v\) 得到了从 \(s\)\(v\) 的最短路径;\(v\) 的邻居更新了到 \(s\) 的距离
\(3\) 重复步骤 \(2\),直到所有点都扩展到并计算完毕 集合 \(A\) 为空。计算出所有点到 \(s\) 的最短距离

按照这个步骤,实现 Dijkstra 其实并不难,现在给出参考实现代码。

实现

暴力做法(\(O(n^2)\)

struct edge {int v, w;
};vector<edge> e[MAXN];
int dis[MAXN], vis[MAXN];void dijkstra(int n, int s) {memset(dis, 0x3f, (n + 1) * sizeof(int));dis[s] = 0;for (int i = 1; i <= n; i++) {int u = 0, mind = 0x3f3f3f3f;for (int j = 1; j <= n; j++)if (!vis[j] && dis[j] < mind) u = j, mind = dis[j];vis[u] = true;for (auto ed : e[u]) {int v = ed.v, w = ed.w;if (dis[v] > dis[u] + w) dis[v] = dis[u] + w;}}
}

优先队列做法(\(O(m\log m)\)

struct edge {int v, w;
};struct node {int dis, u;bool operator>(const node& a) const { return dis > a.dis; }
};vector<edge> e[MAXN];
int dis[MAXN], vis[MAXN];
priority_queue<node, vector<node>, greater<node>> q;void dijkstra(int n, int s) {memset(dis, 0x3f, (n + 1) * sizeof(int));memset(vis, 0, (n + 1) * sizeof(int));dis[s] = 0;q.push({0, s});while (!q.empty()) {int u = q.top().u;q.pop();if (vis[u]) continue;vis[u] = 1;for (auto ed : e[u]) {int v = ed.v, w = ed.w;if (dis[v] > dis[u] + w) {dis[v] = dis[u] + w;q.push({dis[v], v});}}}
}

Dijkstra 总体上就这些内容了,那么接下来就可以编码了。

参考代码

#include<bits/stdc++.h>
#define int long long
#define Rint register int
#define fast_running ios::sync_with_stdio(false),std::cin.tie(nullptr),std::cout.tie(nullptr)
using namespace std;
typedef pair<int, int> PII;
const int N = 1e5 + 5, M = 1e5 + 5;
const int INF = 0x3f3f3f3f;
int m, s, cnt;
int head[N], dist[N], flag[N];
priority_queue<PII, vector<PII>, greater<PII>> q;     //优先队列优化 
struct edge {int from, to, next, w;
} e[M << 1];
void addedge(int u, int v, int w) {                   //建图 e[++cnt].from = u;e[cnt].to = v;e[cnt].next = head[u];e[cnt].w = w;head[u] = cnt;
}
void init() {                                         //初始化 for (int i = 0; i < N; i++) {head[i] = -1;flag[i] = 0;dist[i] = INF;}cnt = 0;return;
}
void dijshort(int start) {                            //优先队列优化的 Dijkstra dist[start] = 0;q.push({dist[start], start});while (!q.empty()) {PII tp = q.top();q.pop();int id_x = tp.second, dist_x = tp.first;if (flag[id_x]) continue;flag[id_x] = 1;for (int i = head[id_x]; i != -1; i = e[i].next) {int v = e[i].to;if (dist[v] > dist_x + e[i].w) {dist[v] = dist_x + e[i].w;q.push({dist[v], v});}}}
}
signed main() {fast_running;cin >> m;init();for (int i = 1; i <= m; i++) {int u, v, w;cin >> u >> v >> w;addedge(u, v, w);addedge(v, u, w);}cin >> s;dijshort(s);int T, in;cin >> T;while (T--) {cin >> in;if (dist[in] == INF) cout << "NO PATH\n";else cout << dist[in] << '\n';}return 0;
}
http://www.zskr.cn/news/1161.html

相关文章:

  • 原型设计实用干货!3款热门AI生成原型图软件横向测评
  • 错误报警:“该 CPU 或当前的库版本不支持数据类型”
  • Charles实战秘籍:弱网模拟、Map Local/Remote、HTTPS抓包详解
  • 9月23日周二《AI+企业IP获客联盟峰会》,相约东莞厚街富盈酒店
  • 第一次作业 自我介绍+软工5问
  • 深度学习调参新思路:Hyperband早停机制提升搜索效率
  • Nginx 基础
  • .NET 单文件程序详解:从原理到实践 - C#混淆加密大师解包打包单文件程序
  • Rust/C/C++ 混合构建 - Buck2构建工具一探究竟
  • Linux运维-字符处理(1、文件查看)
  • Rust 环境搭建
  • Node-RED 究竟是否适合工业场景?
  • 向量化与嵌入模型:RAG系统背后的隐形英雄
  • 模拟信号采集的硬件基石:高性能ADC设计的核心法则
  • WPS设置多级标题,一级标题为“一”、“二”、“三”,二级标题为“1.1”、“2.2”、“3.3”,三级标题为“1.1.1”、“2.2.2”、“3.3.3”
  • 第一周个人作业
  • Modbus开发不头疼:极简指南,半小时搞定基础配置
  • 通过命令行生成.url链接文件
  • 麒麟V10安装docker
  • 湾区杯网络安全大赛 WEB方向WP 全
  • nim整活-道歉程序
  • jmeter-BeanShell PostProcessor
  • HyperWorks许可管理软件
  • ARC176E题解
  • 手把手带你入门AI智能体:从核心概念到第一个能跑的Agent
  • 【IEEE出版】第六届智能计算与人机交互国际研讨会(ICHCI 2025)
  • 产品经理实战指南:用户需求分析全流程详解(含工具链整合)
  • kylin V11安装mysql8.0
  • idea 允许多运行java示例 idea2022版本
  • 2025年第五届电子信息工程与计算机科学国际会议(EIECS 2025)