Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commitc6771d47de5d55edf9a97605889ba75f1579d9af (patch)
Author
 Syndamia <kamen@syndamia.com>
2023-05-22 10:52:31 +0300
Committer
 Syndamia <kamen@syndamia.com>
2023-05-22 10:52:31 +0300
Filesed7be1536901af3667e5f13b7d97dfeb601501e1
uni-projects-c6771d47de5d55edf9a97605889ba75f1579d9af.tar
uni-projects-c6771d47de5d55edf9a97605889ba75f1579d9af.tar.gz
uni-projects-c6771d47de5d55edf9a97605889ba75f1579d9af.zip
Parent26ad55a1c9bd60b5eb08205fa5bca7fd577b0637 (diff)
[DAAP/H2] Improved Deijkstra solution
1 files changed, 9 insertions, 8 deletions
-rw-r--r--Year 2/Design and analysis of algorithms/Practicum/Homeworks/HW2-Zigzag.cpp17
diff --git a/Year 2/Design and analysis of algorithms/Practicum/Homeworks/HW2-Zigzag.cpp b/Year 2/Design and analysis of algorithms/Practicum/Homeworks/HW2-Zigzag.cpp
index 0b1a994..57efbf6 100644
--- a/Year 2/Design and analysis of algorithms/Practicum/Homeworks/HW2-Zigzag.cpp
+++ b/Year 2/Design and analysis of algorithms/Practicum/Homeworks/HW2-Zigzag.cpp
@@ -15,8 +15,9 @@ long long dijkstra(long long s) {
priority_queue<Qedge, vector<Qedge>, greater<Qedge>> q;
vector<bool> visitedlt(N, false);
vector<bool> visitednlt(N, false);
- vector<long long> dist(N);
- dist[s] = 0;
+ vector<long long> distlt(N, 0);
+ vector<long long> distnlt(N, 0);
+ distlt[s] = distnlt[s] = 0;
q.push({{ 0, s }, true});
while (!q.empty()) {
auto c = q.top().first;
@@ -25,23 +26,23 @@ long long dijkstra(long long s) {
if (lt) visitedlt[c.second] = true;
else visitednlt[c.second] = true;
- bool added = false;
for (Edge& e : (lt) ? graph[c.second].second : graph[c.second].first) {
if (e.second == 0 || e.second== c.second ||
(!lt && visitedlt[e.second]) ||
(lt && visitednlt[e.second])) continue;
- // cout << "From: " << c.second << " To: " << e.second << endl;
- long long nd = dist[c.second] + e.first;
+ // cout << "From: " << c.second+1 << " To: " << e.second+1 << endl;
+ vector<long long>& dist = (lt) ? distlt : distnlt, distc = (!lt) ? distlt : distnlt;
+ long long nd = distc[c.second] + e.first;
if ((dist[e.second] == 0 || nd < dist[e.second])) {
dist[e.second] = nd;
q.push({ e, !lt });
- added = true;
}
// cout << dist[e.second] << endl;
}
- if (!added && c.second != N-1) dist[c.second] -= c.first;
}
- return dist[N-1];
+ if (distlt[N-1] == 0) return distnlt[N-1];
+ if (distnlt[N-1] == 0) return distlt[N-1];
+ return min(distlt[N-1], distnlt[N-1]);
}
int main() {