diff options
| author | mzuenni <michi.zuendorf@gmail.com> | 2022-06-27 17:19:28 +0200 |
|---|---|---|
| committer | mzuenni <michi.zuendorf@gmail.com> | 2022-06-27 17:19:28 +0200 |
| commit | 5ab8a5088b729a9953b8dff1b2a985dc8fb2098b (patch) | |
| tree | ed40d6936c0e9eee40ba62751cbf99ecddbaddc2 /graph/dijkstra.cpp | |
| parent | adabbad9c51cf7cd3874bfde8eac1fbcf84fec10 (diff) | |
updated tcr
Diffstat (limited to 'graph/dijkstra.cpp')
| -rw-r--r-- | graph/dijkstra.cpp | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/graph/dijkstra.cpp b/graph/dijkstra.cpp index 52cb57e..0b821dd 100644 --- a/graph/dijkstra.cpp +++ b/graph/dijkstra.cpp @@ -1,17 +1,21 @@ -// Laufzeit: O((|E|+|V|)*log |V|) -void dijkstra(int start) { - priority_queue<ii, vector<ii>, greater<ii> > pq; - vector<int> dist(NUM_VERTICES, INF), parent(NUM_VERTICES, -1); - dist[start] = 0; pq.push(ii(0, start)); +using path = pair<ll, int>; //dist, destination + +void dijkstra(const vector<vector<path>> &adjlist, int start) { + priority_queue<path, vector<path>, greater<path>> pq; + vector<ll> dist(sz(adjlist), INF); + vector<int> prev(sz(adjlist), -1); + dist[start] = 0; pq.emplace(0, start); while (!pq.empty()) { - ii front = pq.top(); pq.pop(); - int curNode = front.second, curDist = front.first; - if (curDist > dist[curNode]) continue; // WICHTIG! - - for (auto n : adjlist[curNode]) { - int nextNode = n.first, nextDist = curDist + n.second; - if (nextDist < dist[nextNode]) { - dist[nextNode] = nextDist; parent[nextNode] = curNode; - pq.push(ii(nextDist, nextNode)); -}}}} + path front = pq.top(); pq.pop(); + if (front.first > dist[front.second]) continue; // WICHTIG! + + for (path e : adjlist[front.second]) { + ll newDist = front.first + e.first; + if (newDist < dist[e.second]) { + dist[e.second] = newDist; + prev[e.second] = front.second; + pq.emplace(newDist, e.second); + }}} + //return dist, prev; +} |
