Advertisement
Guest User

Untitled

a guest
May 24th, 2015
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.01 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define IMPOSSIVEL 0x3f3f3f3f
  6.  
  7. int best[500];
  8. bool visited[500];
  9. int n;
  10.  
  11. int matriz[500][500];
  12. int matrizT[500][500];
  13.  
  14. void dijkstra(int s) {
  15.     memset(best, 0x3f, sizeof(best));
  16.     memset(visited, false, sizeof(visited));
  17.  
  18.     best[s] = 0;
  19.     while (true) {
  20.         int x = -1, menor = IMPOSSIVEL;
  21.         for (int k = 0; k < n; k++) {
  22.             if (best[k] < menor && !visited[k]) {
  23.                 x = k;
  24.                 menor = best[x];
  25.             }
  26.         }
  27.         if(x == -1) break;
  28.         // cout << "next " << x << " - " << best[x] << endl;
  29.         visited[x] = true;
  30.  
  31.         for (int i = 0; i < n; i++) {
  32.             if (matriz[x][i] == 0)
  33.                 continue;
  34.             if (best[x] + matriz[x][i] < best[i]) {
  35.                 best[i] = best[x] + matriz[x][i];
  36.             }
  37.         }
  38.     }
  39. }
  40.  
  41. void dfs(int u) {
  42.     visited[u] = true;
  43.     for (int i = 0; i< n; i++) {
  44.         if (matrizT[u][i] == 0)
  45.                 continue;
  46.         if (best[i] == best[u] - matrizT[u][i]) {
  47.             matriz[i][u] = 0;
  48.             if (!visited[i])
  49.                 dfs(i);
  50.         }
  51.     }
  52. }
  53.  
  54.  
  55. int main(int argc, char const *argv[])
  56. {
  57.     for (;;) {
  58.         int m;
  59.         cin >> n >> m;
  60.         if (n == 0 && m == 0)
  61.             break;
  62.  
  63.         int s, d;
  64.         cin >> s >> d;
  65.  
  66.         memset(matriz, 0, sizeof(matriz));
  67.         memset(matrizT, 0, sizeof(matrizT));
  68.         for(int i = 0; i < m; i++) {
  69.             int u,v,p;
  70.             cin >> u >> v >> p;
  71.             matriz[u][v] = p;
  72.             matrizT[v][u] = p;
  73.         }
  74.  
  75.         dijkstra(s);
  76.         if (best[d] == IMPOSSIVEL) {
  77.             cout << "-1" << endl;
  78.             return 0;
  79.         }
  80.  
  81.         memset(visited, false, sizeof(visited));
  82.         visited[s] = true;
  83.         dfs(d);
  84.         dijkstra(s);
  85.         if (best[d] == IMPOSSIVEL)
  86.             cout << "-1" << endl;
  87.         else
  88.             cout << best[d] << endl;
  89.     }
  90.  
  91.     return 0;
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement