Advertisement
wintest

dijkstra

Jan 9th, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.02 KB | None | 0 0
  1. #include<iostream>
  2.  
  3. using namespace std;
  4. #define INF 1000000000
  5. #define MAX 10000
  6. int G[MAX][MAX], c[MAX][MAX], U[MAX],
  7. p[MAX], d[MAX], n, m, r;
  8.  
  9.  
  10. void dijkstra(int r)
  11. {
  12.     int v, w, min, i, j;
  13.     for (i = 1; i <= n; i++) { U[i] = 0; p[i] = r; d[i] = INF; }
  14.     d[r] = p[r] = 0;
  15.     for (i = 1; i <= n; i++)
  16.     {
  17.         v = 0; min = INF;
  18.         for (j = 1; j <= n; j++)
  19.             if (U[j] == 0 && d[j] < min) { v = j; min = d[j]; }
  20.         U[v] = 1;
  21.         for (j = 1; j <= G[v][0]; j++)
  22.         {
  23.             w = G[v][j];
  24.             if (U[w] == 0 && d[v] + c[v][w] < d[w])
  25.             {
  26.                 d[w] = d[v] + c[v][w]; p[w] = v;
  27.             }
  28.         }
  29.     }
  30. }
  31.  
  32. int main() {
  33.  
  34.     int u, v, w, i, j;
  35.     scanf_s("%d %d %d", &n, &m, &r);
  36.     for (i = 1; i <= n; i++) {
  37.         G[i][0] = 0;
  38.         for (j = 1; j <= n; j++) {
  39.             c[i][j] = INF;
  40.             if (i == j)c[i][j] = 0;
  41.         }
  42.     }
  43.     for (i = 1; i <= m; i++) {
  44.         scanf_s("%d %d %d", &u, &v, &w);
  45.         G[u][++G[u][0]] = v;
  46.         G[v][++G[v][0]] = u;
  47.         c[u][v] = c[v][u] = w;
  48.     }
  49.     dijkstra(r);
  50.     for (i = 1; i <= n; i++) {
  51.         printf("%d %d\n", i, d[i]);
  52.     }
  53.     return 0;
  54.  
  55.  
  56. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement