-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path3_3_0.cpp
More file actions
71 lines (55 loc) · 2.52 KB
/
Copy path3_3_0.cpp
File metadata and controls
71 lines (55 loc) · 2.52 KB
1
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
60
61
62
63
64
65
66
67
68
69
70
71
/*//==============================================================================================================
Требуется отыскать самый выгодный маршрут между городами.
Требования: время работы O((N+M)logN), где N-количество городов, M-известных дорог между ними.
Формат входных данных.
Первая строка содержит число N – количество городов.
Вторая строка содержит число M - количество дорог.
Каждая следующая строка содержит описание дороги (откуда, куда, время в пути).
Последняя строка содержит маршрут (откуда и куда нужно доехать).
Формат выходных данных.
Вывести длину самого выгодного маршрута.
*/ //==============================================================================================================
#include <iostream>
#include <vector>
#include <queue>
#include <limits>
using namespace std;
const int INF = numeric_limits<int>::max();
vector<int> dijkstra(int N, const vector<vector<pair<int, int>>> &adj, int start);
int main() {
int N, M;
cin >> N >> M;
vector<vector<pair<int, int>>> vertexes(N);
for (int i = 0; i < M; ++i) {
int vertexFrom, vertexTo, time;
cin >> vertexFrom >> vertexTo >> time;
vertexes[vertexFrom].emplace_back(vertexTo, time);
vertexes[vertexTo].emplace_back(vertexFrom, time); // учитываем непрямой маршрут
}
int start, end;
cin >> start >> end;
vector<int> dist = dijkstra(N, vertexes, start);
cout << dist[end] << endl;
return 0;
}
vector<int> dijkstra(int N, const vector<vector<pair<int, int>>> &adj, int start) {
vector<int> dist(N, INF);
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq;
dist[start] = 0;
pq.emplace(0, start);
while (!pq.empty()) {
int currentDist = pq.top().first;
int u = pq.top().second;
pq.pop();
if (currentDist > dist[u]) continue;
for (const auto &neighbor: adj[u]) {
int v = neighbor.first;
int weight = neighbor.second;
if (dist[u] + weight < dist[v]) {
dist[v] = dist[u] + weight;
pq.emplace(dist[v], v);
}
}
}
return dist;
}