1. 程式人生 > >【總結】差分約束模型的要點

【總結】差分約束模型的要點

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

【總結】差分約束模型的要點