Advertisement
Guest User

dijkstra

a guest
Oct 16th, 2016
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.13 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <stdlib.h>
  5. #include <algorithm>
  6. #include <cstring>
  7. #include <queue>
  8.  
  9.  
  10. #define INF 2147483647
  11.  
  12. using namespace std;
  13.  
  14. int N;
  15.  
  16. int dijkstra(vector<vector<pair<int, int>>> adj, int start, int goal)
  17. {
  18.     vector<unsigned int> distanza (N, INF);
  19.  
  20.     /* Coda contenente i nodi in lavorazione */
  21.     priority_queue<
  22.             pair<int, int>,
  23.             vector<pair<int, int>>,
  24.             greater<pair<int, int>> > pq;
  25.  
  26.     vector<bool> solved(N, false);
  27.  
  28.     distanza[start] = 0;
  29.     solved[start] = true;
  30.     pq.push({0, start});
  31.  
  32.     /* Finché ci sono nodi in coda */
  33.     while (!pq.empty()) {
  34.         pair<int, int> current = pq.top();
  35.         pq.pop();
  36.  
  37.         int cn = current.second;
  38.         int cc = current.first;
  39.         solved[cn] = true;
  40.  
  41.         /* Controllo i nodi adiacenti */
  42.         for (vector<pair<int, int>>::iterator it = adj[cn].begin(); it != adj[cn].end(); it++) {
  43.             int i = it->first;
  44.             int partial_cost = it->second;
  45.  
  46.             /* Se è già stato marcato come risolto lo salto */
  47.             if (solved[i]) continue;
  48.  
  49.             int new_cost = cc + partial_cost;
  50.  
  51.             /* Se il costo per accedere da questo nodo è minore, lo riaggiungo alla coda */
  52.             if (new_cost < distanza[i]) {
  53.                 distanza[i] = new_cost;
  54.                 pq.push({distanza[i], i});
  55.             }
  56.         }
  57.  
  58.     }
  59.     return distanza[goal];
  60.  
  61. }
  62.  
  63.  
  64. int main() {
  65.  
  66.     int A;
  67.     int S, D;
  68.     ifstream input("input.txt");
  69.     ofstream output("output.txt");
  70.  
  71.     input >> N >> A;
  72.     input >> S >> D;
  73.  
  74.     vector< vector< pair<int, int> > > adj (N);
  75.     for (int i = 0; i < N; i++) {
  76.         vector<pair<int, int>> v;
  77.         adj[i] = v;
  78.     }
  79.  
  80.     for (int i = 0; i < A; i++) {
  81.         int source, dest, cost;
  82.         input >> source >> dest >> cost;
  83.         adj[source-1].push_back(make_pair(dest-1, cost));
  84.         //adj[dest-1].push_back(make_pair(source-1, cost));
  85.     }
  86.  
  87.     int ret = dijkstra(adj, S-1, D-1);
  88.  
  89.  
  90.     output << ret;
  91.     output.close();
  92.  
  93.     return 0;
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement