Bellman-Ford
看來一千個acmer有一千個迪杰斯特拉,Bellman-Ford也是一樣。
看了劉汝佳的bellman-ford,簡直和spfa一模一樣啊!!!
松弛n -1 次還是可以松弛,說明有負(fù)環(huán);
劉汝佳寫得很有水平,學(xué)習(xí)了。每個點(diǎn)都有可能從這個點(diǎn)出發(fā)找到負(fù)環(huán),都入隊列,相互間分開,找第一個點(diǎn),找到負(fù)邊,入對列,原來的點(diǎn)出隊列,下次有可能還用到; 該點(diǎn)不是最優(yōu)的。要搜索該點(diǎn)。下次同等級別的點(diǎn)找到該點(diǎn),就不用push到隊列中了!!!
?
當(dāng)下次還可以通過其他點(diǎn)松弛他cnt++;他又被松弛了;如果他被松弛了好多好多次(n-1);這樣下去的只能說明一個問題:已經(jīng)沒有最短路,有的只是一個負(fù)圈;因為,既然可以通過好多好多點(diǎn)通過這個點(diǎn)繼續(xù)找到更近的路,而這些點(diǎn)早可以夠成了一條最短路了,什么情況這個點(diǎn)可以被松弛好多好多次呢,就是這個點(diǎn)存在于一個負(fù)圈里面,其他點(diǎn)到這個點(diǎn)轉(zhuǎn)一圈 d 又減小了;
?
#include <bits/stdc++.h> using namespace std;const int maxn = 10000;struct Edge {int from,to;double dist; };struct BellmanFord {int n, m;vector<Edge> edges;vector<int> G[maxn];bool inq[maxn];double d[maxn];int p[maxn];int cnt[maxn];void init(int n){this->n = n;for(int i = 0; i < n; i++) G[i].clear();edges.clear();}void AddEdge(int from, int to, double dist){edges.push_back((Edge){from, to, dist});m = edges.size();G[from].push_back(m-1);}bool negativeCycle(){queue<int> Q;memset(inq, 0, sizeof(inq));memset(cnt, 0, sizeof(cnt));for(int i = 0; i < n; i++){d[i] = 0;inq[0] = true;Q.push(i);}while(!Q.empty()){int u = Q.front();Q.pop();inq[u] = false;for(int i = 0; i < G[u].size(); i++){Edge& e = edges[G[u][i]];if(d[e.to] > d[u] + e.dist){d[e.to] = d[u] + e.dist;p[e.to] = G[u][i];if(!inq[e.to]){Q.push(e.to);inq[e.to] = true;if(++cnt[e.to] > n) return true;}}}}return false;} };?
轉(zhuǎn)載于:https://www.cnblogs.com/TreeDream/p/6111387.html
總結(jié)
以上是生活随笔為你收集整理的Bellman-Ford的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用Delphi的File Of Typ
- 下一篇: 预备作业02 20162320刘先润