SPFA.cpp 988 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. // SPFA O(kE).
  2. struct Edge {
  3. int v, cost;
  4. Edge(int _v=0, int _cost=0): v(_v),cost(_cost){}
  5. };
  6. vector<Edge> E[MAXN];
  7. void addedge(int u,int v,int w) {
  8. E[u].push_back(Edge(v, w));
  9. }
  10. bool vis[MAXN];// vis[i] i is in queue or not
  11. int cnt[MAXN];// cnt[i]: i rentre cnt[i] fois dans la queue.
  12. int dist[MAXN];
  13. bool SPFA(int start,int n) {
  14. memset(vis, false, sizeof(vis));
  15. for(int i = 1; i <= n; i++) dist[i] = INF;
  16. vis[start] = true; dist[start] = 0;
  17. queue<int> que;
  18. while(! que.empty()) que.pop();
  19. que.push(start);
  20. memset(cnt, 0, sizeof(cnt));
  21. cnt[start] = 1;
  22. while(!que.empty()) {
  23. int u = que.front(); que.pop ();
  24. vis[u] = false;
  25. for(int i = 0; i < E[u].size(); i++) {
  26. int v = E[u][i].v;
  27. if(dist[v] > dist[u] + E[u][i].cost ) {
  28. dist[v] = dist[u] + E[u][i].cost;
  29. if(!vis[v]) {
  30. vis[v] = true;
  31. que.pus h(v);
  32. if(++cnt[v] > n) return false; //negatif circle
  33. }
  34. }
  35. }
  36. }
  37. return true;
  38. }