【總結】差分約束模型的要點
阿新 • • 發佈:2017-10-03
cio 一個點 ros 最短路 所有 運行時間 16px net 不同
只是一些自己想到的東西,記下來以防忘記。
1. 求解一系列的 f[b] - f[a] <= x 不等式組時,由a向b建權值為x的邊,求最短路。有負環時無解,體現為在SPFA中一個點入隊超過n次。
2. 求解一系列的 f[b] - f[a] >= x 不等式組時,由a向b建權值為x的邊,求最長路。有正環時無解,體現為在SPFA中一個點入隊超過n次。
3. 當不等式組中有兩種不等式時,應轉化為一種不等式,再建邊、求最短(長)路。f[b] - f[a] == x 可轉化為 f[b] - f[a] <= x 與 f[b] - f[a] >= x 的組合。
4. 需要判無解時若n過大,可以減小入隊次數標準以求減小運行時間,例如sqrt(n)次,帶來的後果是有可能會出錯。(不確定)
5. 判斷不等式組是否有解時,可能沒有確定的起點,需要加一個超級源點s,並向所有其它點連一條s到該點權值為0的有向邊,再從點s跑SPFA。
6. 求點s到點t的最短路,即求滿足所有不等式的 f[t] - f[s] 的最大值(求最長路時類似)。有些題目中s和t不是確定的,需要自己判斷,如果搞反了顯然答案是錯誤的(有向圖不同於無向圖)。
7. 註意隱含的不等式,如 sum[i+1] - sum[i] >= 0 等等。
下面兩個博客有非常詳細的講解/習題,很不錯:
http://www.cppblog.com/menjitianya/archive/2015/11/19/212292.html
http://blog.csdn.net/consciousman/article/details/53812818
【總結】差分約束模型的要點