/** Алгоритъм на Дийкстра за най-къси пътища от даден стартов връх s (с priority_queue) */ #include #include #include #include #define Inf 2000000000 using namespace std; typedef pair pr; const int n = 8; vector graph[n] = { { pr(1, 1), pr(3, 3), pr(4, 5) }, { pr(0, 1), pr(2, 2), pr(5, 2) }, { pr(1, 2), pr(4, 6) }, { pr(0, 3), pr(6, 10) }, { pr(0, 5), pr(2, 6), pr(6, 7), pr(7, 2) }, { pr(1, 2), pr(7, 5) }, { pr(3, 10), pr(4, 7), pr(7, 20) }, { pr(4, 2), pr(5, 5), pr(6, 20) } }; bool finalized[n]; int dist[n]; int parent[n]; void Dijkstra(int s) { for (int i = 0; i < n; i++){ dist[i] = Inf; finalized[i] = false; parent[i] = -1; } priority_queue, vector >, greater > > q; // minHeap q.push(pair(0, s)); dist[s] = 0; while (!q.empty()) { int u = q.top().second; q.pop(); if (!finalized[u]) { finalized[u] = true; for (pr e : graph[u]) { int v = e.first, w = e.second; if (!finalized[v] && w + dist[u] < dist[v]) { parent[v] = u; dist[v] = w + dist[u]; q.push(pair(dist[v], v)); } } } } } int main() { Dijkstra(0); for (int i = 0; i < n; i++) if (dist[i] != Inf)cout << dist[i] << " "; else cout << "INF "; cout << endl; return 0; }