1+ int find_min (vector<int > &distance, int n, vector<int > &visited) {
2+ int mn = INT_MAX;
3+ int index = 0 ;
4+ for (int i = 0 ; i < n; i++) {
5+ if (!visited[i] and mn >= distance[i]) {
6+ mn = distance[i];
7+ index = i;
8+ }
9+ }
10+ return index;
11+ }
12+ vector<int > dijkstra (int n, vector<vector<int >> adj[], int S) {
13+ vector<int > distance (n, INT_MAX);
14+ vector<int > visited (n, 0 );
15+
16+ distance[S] = 0 ;
17+ for (int i = 0 ; i < n - 1 ; i++) {
18+ int min_dist_node = find_min (distance, n, visited);
19+ visited[min_dist_node] = 1 ;
20+ for (auto x : adj[min_dist_node]) {
21+ int nei = x[0 ];
22+ int dist = x[1 ];
23+ if (!visited[nei] and distance[min_dist_node] != INT_MAX) {
24+ distance[nei] = min (distance[nei], distance[min_dist_node] + dist);
25+ }
26+ }
27+ }
28+ return distance;
29+ }
30+
31+ // QUEUE method
32+
33+ vector<int > dijkstra (int n, vector<pair<int , int >> adj[], int src) {
34+ // Array of vectors of pairs
35+ // pair = (destination, cost)
36+ // min-heap {dist, node}
37+ priority_queue<pair<int , int >, vector<pair<int , int >>, greater<pair<int , int >>> pq;
38+ vector<int > distance (n + 1 , INT_MAX);
39+ distance[src] = 0 ;
40+ pq.push ({0 , src});
41+ while (pq.size ()) {
42+ int dist = pq.top ().first ;
43+ int curr = pq.top ().second ;
44+ pq.pop ();
45+ for (auto pr : adj[curr]) {
46+ int neigh = pr.first ;
47+ int edge_cost = pr.second ;
48+ if (distance[neigh] > distance[curr] + edge_cost) {
49+ distance[neigh] = distance[curr] + edge_cost;
50+ pq.push ({distance[neigh], neigh});
51+ }
52+ }
53+ }
54+ return distance;
55+ }
0 commit comments