Bellman - Ford算法是求含<b>負(fù)權(quán)圖</b>的單源最短路徑算法,效率很低,但代碼很容易寫。其原理為持續(xù)地進行松弛(原文是這么寫的,為什么要叫松弛,爭議很大),在每次松弛時把每條邊都更新一下,若在n-1次松弛后還能更新,則說明圖中有負(fù)環(huán),因此無法得出結(jié)果,否則就完成。Bellman - Ford算法有一個小優(yōu)化:每次松弛先設(shè)一個標(biāo)識flag,初值為FALSE,若有邊更新則賦值為TRUE,最終如果還是FALSE則直接成功退出。
struct edge {
int from,to;
int cost;
};
edge es[MAXE];
int d[MAXV]; // d[i]表示d[start]到i點的最短距離
int v, e; // 頂點數(shù), 邊數(shù)
void Bellman_Ford(int s) {
fill(d + 1, d + v + 1, INF);
d[s] = 0;
for (int i = 1; i <= v; ++i) {
bool update = false;
for (int j = 0; j < e; ++j) {
if (d[es[j].from] != INF) {
d[es[j].to] = min(d[es[j].to], d[es[j].from] + es[j].cost);
update = true;
}
}
if (!update)
break;
}
bool flag = false;
for (int i = 0; i < es.size(); ++i) {
if (d[es[i].to] > d[es[i].from] + es[i].cost) {
flag = true;
break;
}
}
if (flag)
cout << "圖包含了負(fù)權(quán)環(huán)";
}