鑑於spfa基礎上的差分約束演算法

2022-03-01 02:47:25 字數 1633 閱讀 8655

怎麼搞?

1. 如果要求最大值

想辦法把每個不等式變為標準x-y<=k的形式,然後建立一條從y到x權值為k的邊,變得時候注意x-yx-y<=k-1

將這些約束條件轉化為差分約束,不妨設t[x] = s[1]+s[2]+....s[x],那麼上面式子就可以轉化為:

1. t[si+ni] - t[si-1] > ki          2. t[si+ni] - t[si-1] < ki 

又差分約束系統的求解只能針對》=或<=,無法求解》的系統,還好ki是整數,可以很容易將《轉化為<= 

1. t[si-1] - t[si+ni] <= -ki - 1    2. t[si+ni] - t[si-1] <= ki - 1 

如果要求最小值

的話,變為x-y>=k的標準形式,然後建立一條從y到x的k邊,求出最長路徑即可,ralex;

2.如果權值為正,用dijk,spfa,bellman都可以,如果為負不能用dijk,並且需要判斷是否有負環,有的話就不存在

1.怎麼建圖;(為什麼這麼建圖)

2.為什麼求的是最長路,為什麼是最短路。

3.為什麼可以這麼做,別的方法還有的。

spfa去鬆弛的意思是什麼?

1.找最長或者最短,或者

判斷負環

2.也就是   例如:poj1364king題(判斷負環,表示滿足);

注:在spfa開始時將所有結點都放進佇列,這樣表示一開始和所有點都相連了,初始化dis陣列為全0,相當於超級源點的邊權值;

/*********------big problem*******-------//////-----

差分約束的dis[i]代表什麼;

距離;什麼距離.

所以說...

/*********------big problem*******-------//////-----

這裡有個技巧就是使用spfa不想新增附加的節點vs的話,可以在初始化把所有的節點都加到佇列中去,其實就相當於源點入隊,開始演算法後vs出隊

更新所得的佇列,因為沒有邊指向vs,所以後面的更新不會涉及到vs,即在後面的計算中都不會用到vs。

/*******--------建圖///初始化--------**************////////***---

【超級源點】

spfa的性質決定,因為智障的spfa會先從乙個點去引開它所連線的點。。。所以炒雞源點就是非常炒雞!!非常牛逼,連線了n個點

由於p  a  b  x 指「確定a到b的距離(邊權)為x」

從p  a  b  x得到的差分系統為

dist[a] - dist[b] >= x  &&  dist[a] - dist[b] <= x

等價於dist[b] <= dist[a] - x  &&  dist[a] <= dist[b] + x

則if(dist[b] > dist[a]-x) 鬆弛:dist[b] = dist[a]-x

由於 v  a  b指「只知道a到b的距離(邊權)至少為1」

從v  a  b得到的差分系統為

dist[a] >= dist[b] +1

等價於dist[b] <= dist[a] -1

則if(dist[b] > dist[a] -1)  鬆弛:dist[b] = dist[a] -1

小K的農場(差分約束,spfa)

小k在mc裡面建立很多很多的農場,總共n個,以至於他自己都忘記了每個農場中種植作物的具體數量了,他只記得一些含糊的資訊 共m個 以下列三種形式描述 但是,由於小k的記憶有些偏差,所以他想要知道存不存在一種情況,使得農場的種植作物數量與他記憶中的所有資訊吻合。輸入格式 第一行包括兩個整數 n 和 m,...

a b 在編譯基礎上的討論

關於討論 中的 c a b 這個表示式的面試題一直都在出現。從很直觀的角度上來說你可以理解成為以下的兩種形式 乙個是 c a b 另一種是c a b 其實做過編譯程式的人可以考慮以下過程,在詞法分析階段要進行的是將輸入的檔案切成token,並形成token序列,你可以知道 對 進行處理的時候將執行以...

BZOJ HNOI2005 狡猾的商人(差分約束)

time limit 10 sec memory limit 162 mb submit 4969 solved 2496 submit status discuss 刁奼接到乙個任務,為稅務部門調查一位商人的賬本,看看賬本是不是偽造的。賬本上記錄了n個月以來的收入情況,其中第i 個月的收入額為ai...