負環偵測(negative-cycle detection)
假設你的路網裡有一個迴圈,每繞它一圈總成本就下降——也許是一連串貨幣交易,結束時手上的錢比一開始更多。若這種迴圈從源點可達,「最短」路徑的概念就崩塌:你可以無止盡地繞它,把成本推向負無限大。負環偵測就是演算法如何察覺這件事,並回報「沒有有限答案」而非回傳無意義的結果。
乾淨的測試搭在貝爾曼-福特上。回想在沒有負環時,經過 V-1 趟鬆弛後,每個距離估計都已達到真值,且沒有任何邊還能被鬆弛(三角不等式處處成立)。所以再多跑一趟(第 V 趟)掃過所有邊:若仍有某條邊 (u, v) 能被鬆弛——也就是 d[u] + w(u,v) < d[v] 仍成立——那麼某個最短路徑估計在它本該安定後仍在下降,這只可能在有一個負環可達時發生。要找出實際的環,從估計值下降的那個頂點沿前驅指標往回走,你就會繞上那個作怪的環。整個測試只花一趟額外的 O(E)。
凡是「獲利迴圈」會是錯誤或機會之處,這都很重要:金融上的套利偵測、有期限排程的不可行性檢查,以及在信任任何含負邊圖的最短路徑輸出之前的安全檢查。要分清楚的微妙處:負環只毒害那些能經源點抵達它或被它抵達的頂點;圖中另一個無負環部分的頂點仍有定義良好的最短距離。偵測回答一個是非問題並定位環,但它不會神奇地修好問題——若你在意的路線上存在負環,那就根本沒有最短路徑。
環 a->b (1)、b->c (-3)、c->a (1) 總和為 1-3+1 = -1,是一個負環。經 V-1 趟貝爾曼-福特後,多一趟仍能鬆弛環上某條邊(d 持續下降),標示出該環。貨幣套利是同一幅圖像:一圈匯率其乘積超過 1,對應到對數匯率中的一個負環。
若第 V 趟鬆弛仍改進某條邊,那個本該安定的估計仍在下降——有一個負環可達。
偵測找的是可達的負環,而非全部。源點無法抵達的負環不影響源點的最短路徑,並可能不被以源點為根的貝爾曼-福特執行所回報。