Advertisement
apl-mhd

dijkstra

Apr 22nd, 2018
237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.91 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <stack>
  4. #include <queue>
  5. #include <algorithm>
  6. #include <vector>
  7. #define MAX_SZ 100
  8. #include <climits>
  9.  
  10. using namespace std;
  11. //graph
  12. /*
  13. 5 10
  14. 0 1 10
  15. 0 3 5
  16. 1 2 1
  17. 1 3 2
  18. 2 4 4
  19. 3 1 3
  20. 3 2 9
  21. 3 4 2
  22. 4 0 7
  23. 4 2 6
  24.  
  25. */
  26.  
  27. int n,m;
  28. vector< vector< pair<int, int> > >adj;
  29.  
  30. void print_graph(){
  31.  
  32.     printf("n : %d, %d : m\n", n, m);
  33.  
  34.     for(int i=0; i<n; i++){
  35.  
  36.         printf("%d -> ",i);
  37.  
  38.         for(int j=0; j < adj[i].size(); j++){
  39.  
  40.             printf("%d %d ", adj[i][j].first, adj[i][j].second);
  41.         }
  42.  
  43.         printf("\n");
  44.     }
  45.  
  46. }
  47. int dist[MAX_SZ];
  48. int visited[MAX_SZ];
  49. int parent[MAX_SZ];
  50.  
  51.  
  52. void init(int s){
  53.  
  54.     for(int i=0; i< n; i++){
  55.         dist[i] = INT_MAX;
  56.         visited[i] = 0;
  57.         parent[i] = -1;
  58.  
  59.     }
  60.  
  61.     dist[s]=0;
  62.  
  63. }
  64.  
  65. void relax(int u, int v, int w){
  66.  
  67.         if(dist[v] > dist[u]+w){
  68.             dist[v] = dist[u] +w;
  69.             parent[v] = u;
  70.         }
  71.  
  72.  
  73. }
  74.  
  75. int min_dist_vertex(){
  76.     int m = INT_MAX;
  77.     int mi=-1;
  78.  
  79.       for(int i=0; i< n; i++){
  80.  
  81.       if(visited[i] == 0 && dist[i]<m){
  82.  
  83.         m = dist[i];
  84.         mi = i;
  85.       }
  86.  
  87.     }
  88.  
  89.     return mi;
  90. }
  91.  
  92.  
  93. void dijkstra(int s){
  94.             //visited[]
  95.  
  96.     init(s);
  97.  
  98.       for(int i=0; i< n; i++){
  99.  
  100.        int u = min_dist_vertex();
  101.       // cout
  102.         visited[u] = 1;
  103.        for(int j=0; j<adj[u].size(); j++){
  104.         relax(u,adj[u][j].first, adj[u][j].second);
  105.        }
  106.     }
  107.  
  108.  
  109.     cout<<"shortest path"<<endl;
  110.  
  111.  
  112.     for(int i=0; i<n; i++){
  113.         printf("%d %d \n", dist[i], parent[i]);
  114.     }
  115.  
  116. }
  117. int main()
  118. {
  119.     adj.resize(MAX_SZ);
  120.  
  121.     freopen("input.txt", "r", stdin);
  122.     scanf("%d%d",&n,&m);
  123.  
  124.  
  125.  
  126.     for(int i=0; i<m; i++){
  127.        int u, v,w;
  128.  
  129.        scanf("%d%d%d",&u,&v,&w);
  130.        adj[u].push_back(make_pair(v,w));
  131.  
  132.     }
  133.  
  134.     print_graph();
  135.  
  136.     dijkstra(0);
  137.  
  138.  
  139.     return 0;
  140. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement