Guest User

Untitled

a guest
Sep 1st, 2016
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.09 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4.  
  5. #include <cstdlib>
  6.  
  7. using namespace std;
  8.  
  9.  
  10. int dijkstra(vector<vector<int>> adj, int a, int b, int n) {
  11.     a -= 1;
  12.     b -= 1;
  13.     const int inf = 2147483647;
  14.     vector<int> dist(n);
  15.     vector<bool> solved(n, false);
  16.  
  17.     for (int i = 0; i < n; i++) {
  18.         dist[i] = inf;
  19.     }
  20.  
  21.  
  22.     int current_node = a;
  23.  
  24.     solved[current_node] = true;
  25.     dist[current_node] = 0;
  26.  
  27.     vector<int> to_resolve;
  28.     do {
  29.         to_resolve.clear();
  30.  
  31.         cout << "Sono al nodo " << (current_node+1) << endl;
  32.         // Cerco il nodo meno costoso
  33.         for (int i = 0; i < n; i++) {
  34.             // Aggiungo solo quelli non ancora risolti e con un costo >= 0
  35.             // cout << "solved["<<(i+1)<<"] = " << solved[i] << endl;
  36.             if (solved[i]) continue;
  37.             if (adj[current_node][i] >= 0) {
  38.                 to_resolve.push_back(i);
  39.                 cout << "Potrei andare al nodo " << (i+1) << endl;
  40.             }
  41.         }
  42.  
  43.         /* Calcolo il costo per spostarsi a quei nodi */
  44.         int chosen = -1;
  45.         int chosen_cost = inf;
  46.         for (int i = 0; i < to_resolve.size(); i++) {
  47.             int cost = adj[current_node][to_resolve[i]];
  48.             int total_cost = dist[current_node] + cost;
  49.  
  50.             cout << "Per andare al nodo " << (to_resolve[i]+1) << " il costo: " << cost << ", il costo totale: " << total_cost << endl;
  51.             //cout << "dist[" << to_resolve[i]+1 << "] = " << dist[to_resolve[i]] << " updated to " << total_cost << endl;
  52.             if (dist[to_resolve[i]] > total_cost)
  53.                 dist[to_resolve[i]] = total_cost;
  54.  
  55.             /* Salvo il meno costoso */
  56.             if (chosen == -1 || cost < chosen_cost) {
  57.                 chosen = to_resolve[i];
  58.                 chosen_cost = total_cost;
  59.             }
  60.         }
  61.         cout << "Ho scelto " << chosen+1 << " al costo di " << chosen_cost << endl;
  62.         solved[chosen] = true;
  63.  
  64.         current_node = chosen;
  65.  
  66.         cout << endl << endl;
  67.  
  68.     } while (current_node != b);
  69.  
  70.     for (int i = 0; i < n; i++) {
  71.         cout << "dist[" << i+1 << "] = " << dist[i] << endl;
  72.     }
  73.  
  74.     cout << "fine" << endl;
  75.     return dist[b];
  76. }
  77.  
  78. int main() {
  79.     int N, A, B; // Nodes, Cold Route, Hot Route
  80.  
  81.     ifstream input("input.txt", ios::in);
  82.     input >> N >> A >> B;
  83.  
  84.     vector<vector<int>> adj(N);
  85.     for (int i = 0; i < N; i++) {
  86.         vector<int> row (N, -1);
  87.         adj[i] = row;
  88.     }
  89.  
  90.     for(int i = 0, s, d; i < A+B; i++) {
  91.         input >> s >> d;
  92.         // cout << s << " - " << d << endl;
  93.         adj[s-1][d-1] = adj[d-1][s-1] = (i >= A ? 1 : 0);
  94.     }
  95.  
  96.     cout << ' ';
  97.     for (int i = 0; i < N; i++)
  98.         cout << ' ' << (i+1);
  99.     cout << endl;
  100.     for (int i = 0; i < N; i++) {
  101.         cout << (i+1);
  102.         for (int j = 0; j < N; j++)
  103.             cout << ' ' << adj[i][j];
  104.         cout << endl;
  105.     }
  106.  
  107.  
  108.  
  109.     input.close();
  110.  
  111.     int r = dijkstra(adj, 1, N, N);
  112.     cout << r;
  113.  
  114.     ofstream o("output.txt");
  115.     o << r;
  116.     o.close();
  117.  
  118.     return 0;
  119. }
Advertisement
Add Comment
Please, Sign In to add comment