BellmanFord.cpp 864 B

123456789101112131415161718192021222324252627282930
  1. // Bellman-Ford algorithm
  2. // compute shortest path in a directed graph
  3. // even with negative costs
  4. // find negative cycles
  5. // COMPLEXITY: O(nm)
  6. // USAGE : set dist[*] = INF, dist[src] = 0, nodenum, fill edges
  7. typedef struct Edge{
  8. int u, v, w;
  9. Edge(int u, int v, int w) : u(u), v(v), w(w) {}
  10. }Edge;
  11. vector<Edge> edges;
  12. int dist[10000];
  13. int nodenum;
  14. void relax(int u, int v, int w) {
  15. if(dist[v] > dist[u] + w) {
  16. dist[v] = dist[u] + w;
  17. // predecessor[v] = u
  18. }
  19. }
  20. // return false if there is a negative cycle
  21. bool BellmanFord() {
  22. int edgenum = edges.size();
  23. for(int i = 0; i < nodenum-1; i++)
  24. for(int j = 0; j < edgenum; j++) // (if there is no changes we can break)
  25. relax(edges[j].u, edges[j].v, edges[j].w);
  26. for(int i = 0; i < edgenum; i++)
  27. if(dist[edges[i].u] + edges[i].w < dist[edges[i].v])
  28. return false;
  29. return true;
  30. }