水课刷题,本来以为是 💦 题,本来就是是板子
- Dijkstra 堆优化版
- 邻接表一定要用 vector,不能 map(悲
- P4779
【模板】单源最短路径(标准版)
题面
P4779
【模板】单源最短路径(标准版)
题目背景
2018 年 7 月 19 日,某位同学在 NOI Day 1 T1 归程
一题里非常熟练地使用了一个广为人知的算法求最短路。
然后呢?
;
;
最终,他因此没能与理想的大学达成契约。
小 F 衷心祝愿大家不再重蹈覆辙。
题目描述
给定一个 个点, 条有向边的带非负权图,请你计算从 出发,到每个点的距离。
数据保证你能从
出发到任意点。
输入格式
第一行为三个正整数 。
第二行起 行,每行三个非负整数
,表示从 到 有一条权值为 的有向边。
输出格式
输出一行
个空格分隔的非负整数,表示
到每个点的距离。
输入输出样例 #1
输入 #1
1 2 3 4 5 6 7
| 4 6 1 1 2 2 2 3 2 2 4 1 1 3 5 3 4 3 1 4 4
|
输出 #1
说明/提示
样例解释请参考 数据随机的模板题。
;
;
;
;
,
。
本题数据可能会持续更新,但不会重测,望周知。
2018.09.04 数据更新 from @zzq
Solution
题意好理解,从 s 开始跑一遍 Dijkstra 就行,这个题目的因为我起手就是
pq 的 Dijkstra 所以避开了大多数人 TLE 的坑,但是我用的 Map 套
Map,而这个图恰好可以有重边(寄
nested map1 2 3 4 5
| map<int, map<int, int>> adj; for (int i = 0; i < m; i++) { cin >> u >> v >> w; adj[u][v] = w; }
|
下面的是正解
solution1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| #include <bits/stdc++.h> #define mod (int)(1e9 + 7) #define int long long #define endl '\n' #define pb push_back #define PII pair<int, int> #define PLL pair<ll, ll> #define fst first #define snd second typedef long long ll; typedef unsigned long long ull; typedef long double ld; const int MAX = INT_MAX; const ll LLMAX = LLONG_MAX; const double PI = acos(-1); using namespace std; void solve() { int n, m, s; cin >> n >> m >> s; int u, v, w; map<int, map<int, int>> adj; for (int i = 0; i < m; i++) { cin >> u >> v >> w; if (adj[u].count(v)) adj[u][v] = min(w, adj[u][v]); else adj[u][v] = w; } vector<int> dis(n + 1, 1e18); vector<bool> vis(n + 1, false); priority_queue<PII, vector<PII>, greater<PII>> pq; pq.push({0, s}); dis[s] = 0; while (pq.size()) { auto [d, u] = pq.top(); pq.pop(); if (vis[u]) continue; vis[u] = true; for (auto [v, w] : adj[u]) { if (dis[u] + w < dis[v]) { dis[v] = dis[u] + w; pq.push({dis[v], v}); } } } for (int i = 1; i <= n; i++) { cout << dis[i] << " "; } cout << endl; } signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t = 1; while (t--) solve(); return 0; }
|