monyca98

belman_ford

May 25th, 2018
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.11 KB | None | 0 0
  1. #include<iostream>
  2. #include<fstream>
  3. #include<vector>
  4. #define MAX_SIZE 3000
  5. #define INF 999
  6.  
  7. typedef std::vector<int> vector;
  8. vector vis;  
  9. vector g[MAX_SIZE];   //the graph stored in an adjacency matrix
  10. int  n, m;    //n- no of vertices, m -no of edges
  11. std::vector<std::pair<int,int>> dist;  //first to store the distance
  12.                                         //second to store the parent
  13. int source;
  14. void read()
  15. {
  16.     std::ifstream in("file.txt");
  17.     if (!in.is_open())
  18.         std::cout << "Unable to open the file!\n";
  19.     else
  20.     {
  21.         in >> source;
  22.         int x, y, w;
  23.         in >> n >> m;
  24.         for (long long int i = 0; i < n; i++)
  25.             g[i].assign(n, 0);
  26.  
  27.         for (long long int i = 0; i < m; i++)
  28.         {
  29.             in >> x >> y >> w;
  30.             g[x][y] = w;
  31.             //g[y][x] = w;
  32.         }
  33.     }
  34. }
  35. void init_dist()
  36. {
  37.     for (int i = 0; i < n; i++)
  38.     {
  39.         dist.push_back({ INF,-1 });
  40.         //here NIL parent is -1
  41.     }
  42. }
  43. int belman_ford(int source)
  44. {
  45.     int traverse;
  46.     init_dist();
  47.     dist[source] = { 0,-1 };
  48.     for(int i=0;i<n;i++)
  49.         for (int j = 0; j < n; j++)
  50.         {
  51.             traverse = 0;
  52.             while (traverse < n)
  53.             {
  54.                 if (dist[j].first != INF)
  55.                 {
  56.                     //checking for relaxation
  57.                     if (g[j][traverse]!=0 && dist[traverse].first > dist[j].first + g[j][traverse])
  58.                     {
  59.                         dist[traverse].first = dist[j].first + g[j][traverse];
  60.                         dist[traverse].second = j;
  61.                     }
  62.                 }
  63.                 ++traverse;
  64.             }
  65.         }
  66.     //checking for negative cicles
  67.     for (int i = 0; i < n; i++)
  68.     {
  69.         traverse = 0;
  70.         while (traverse < n)
  71.         {
  72.             if (g[i][traverse]!=0 && dist[i].first+g[i][traverse] < dist[traverse].first)
  73.             {
  74.                 return i;
  75.             }
  76.             ++traverse;
  77.         }
  78.     }
  79.     return -1;
  80. }
  81.  
  82. int main()
  83. {
  84.     read();
  85.     int returned_value=belman_ford(source);
  86.     if (returned_value != -1)
  87.         std::cout << "there is negative cicle!\n";
  88.     else
  89.     {
  90.         for (int i = 0; i < n; i++)
  91.             std::cout << "node:" << i << " distance:" << dist[i].first << " parent:" << dist[i].second << "\n";
  92.    
  93.     }
  94.    
  95.  
  96.     return 0;
  97. }
  98.  
  99. /*
  100.  
  101.  
  102. negative cycles
  103. 5 10
  104. 1 2 -1
  105. 1 3 2
  106. 1 4 4
  107. 2 1 2
  108. 2 3 1
  109. 3 4 5
  110. 3 5 1
  111. 4 3 -1
  112. 5 2 -3
  113. 5 4 4
  114.  
  115. without negative:
  116.  
  117. 5 10
  118. 1 2 -1
  119. 1 3 2
  120. 1 4 4
  121. 2 1 2
  122. 2 3 3
  123. 3 4 5
  124. 3 5 3
  125. 4 3 -1
  126. 5 2 -3
  127. 5 4 4
  128.  
  129. */
Add Comment
Please, Sign In to add comment