Advertisement
apl-mhd

bellManFordDemo

May 8th, 2018
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.69 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. #include <utility>
  10.  
  11.  
  12.  long  long unsigned  int  dist[MAX_SZ];
  13. int visited[MAX_SZ];
  14. int parent[MAX_SZ];
  15.  
  16.  
  17.  
  18. using namespace std;
  19.  
  20.  
  21.  
  22. /*
  23. 5 10
  24. 0 1 6
  25. 0 3 7
  26. 1 4 -4
  27. 1 3 8
  28. 1 2 5
  29. 2 1 -2
  30. 3 2 -3
  31. 3 4 9
  32. 4 0 2
  33. 4 2 7
  34.  
  35. */
  36.  
  37. int n,m;
  38. vector< vector< pair<int, int> > >adj;
  39.  
  40.  
  41. //priority_queue< pair<int , int >,  vector< pair<int, int> >,  greater<pair<int ,int >>   > q;
  42. //priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>>q;
  43.  
  44. queue< pair<int,int> >q;
  45.  
  46.  
  47. void print_graph(){
  48.  
  49.     printf("|V| : %d  |E| : %d \n", n, m);
  50.  
  51.     for(int i=0; i<n; i++){
  52.  
  53.         printf("%d -> ",i);
  54.  
  55.         for(int j=0; j < adj[i].size(); j++){
  56.  
  57.             printf("%d, %d ", adj[i][j].first, adj[i][j].second);
  58.         }
  59.  
  60.         printf("\n");
  61.     }
  62.  
  63. }
  64.  
  65.  
  66. void init(int s){
  67.  
  68.     for(int i=0; i< n; i++){
  69.         dist[i] = INT_MAX;
  70.         //visited[i] = 0;
  71.         //parent[i] = -1;
  72.  
  73.     }
  74.  
  75.     dist[s]=0;
  76.  
  77. }
  78.  
  79.  
  80.  
  81. void bellMan(int s){
  82.  
  83.     init(s);
  84.  
  85.     for (int j = 0; j <n-1 ; ++j) {
  86.  
  87.         for(int k=0; k<n; k++){
  88.  
  89.             // cout << u << ": \n";
  90.  
  91.             for (int i = 0; i < adj[k].size(); ++i) {
  92.  
  93.  
  94.  
  95.                 int v = adj[k][i].first;
  96.                 int vw = adj[k][i].second;
  97.  
  98.                // cout<<k<<" "<<v<<" "<<vw<<endl;
  99.                 int uw = dist[k];
  100.  
  101.                 int tw = uw + vw;
  102.  
  103.                 if (tw < dist[v]) {
  104.                     dist[v] = tw;
  105.  
  106.                     //parent[v] = u;
  107.                     // cout << v << " " << w << endl;
  108.  
  109.                 }
  110.  
  111.             }
  112.  
  113.         }
  114.  
  115.     }//end outer for loop
  116.     cout<<"\n";
  117. }
  118.  
  119.  
  120.  
  121. void  printpathRecursion(int i){
  122.  
  123.  
  124.     if(parent[i] ==-1)
  125.         return;
  126.  
  127.     printpathRecursion(parent[i]);
  128.  
  129.     cout<<parent[i]<<" ";
  130.  
  131.  
  132. }
  133.  
  134. int main()
  135. {
  136.  
  137.    
  138.     adj.resize(MAX_SZ);
  139.     freopen("graph2.txt", "r", stdin);
  140.     scanf("%d%d",&n,&m);
  141.  
  142.  
  143.  
  144.     for(int i=0; i<m; i++){
  145.         int u, v,w;
  146.  
  147.         scanf("%d%d%d",&u,&v,&w);
  148.         adj[u].push_back(make_pair(v,w));
  149.  
  150.     }
  151.  
  152.     // print_graph();
  153.  
  154.     bellMan(0);
  155.  
  156.  
  157.     for (int j = 0; j <n ; ++j) {
  158.         cout<<j<<" "<<dist[j]<<endl;
  159.  
  160.     }
  161.  
  162.  
  163.  
  164.     // printpath(2);
  165.  
  166. /*
  167.     cout<<"\n-----printing path-----\n";
  168.  
  169.     cout<<" V : "<<0<<", Path: 0"; printpathRecursion(0);
  170.     cout<<" Cost : "<<dist[0]<<endl;
  171.  
  172.  
  173.     for(int i=1; i<n; i++){
  174.  
  175.         cout<<" V : "<<i<<", Path: ";
  176.         printpathRecursion(i);
  177.         cout<<" "<<i;
  178.         cout<<", Cost : "<<dist[i]<<endl;
  179.  
  180.  
  181.     }
  182.  
  183.  
  184. */
  185.  
  186.  
  187.     return 0;
  188. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement