poj 3169 差分約束模板題

2021-08-18 22:32:35 字數 1851 閱讀 2291

題意:一些母牛按序號排成一條直線。有兩種要求,a和b距離不得超過x,還有一種是c和d距離不得少於y,問可能的最大距離。如果沒有輸出-1,如果可以隨便排輸出-2,否則輸出最大的距離。

b - a <=x、 b - a >= y、i+1-i>=1。

差分約束系統的解法如下:

1、  根據條件把題意通過變數組表達出來得到不等式組,注意要發掘出隱含的不等式,比如說前後兩個變數之間隱含的不等式關係。

2、  進行建圖:

首先根據題目的要求進行不等式組的標準化。

(1)、如果要求取最小值,那麼求出最長路,那麼將不等式全部化成xi – xj >= k的形式,這樣建立j->i的邊,權值為k的邊,如果不等式組中有xi – xj > k,因為一般題目都是對整形變數的約束,化為xi – xj >= k+1即可,如果xi – xj = k呢,那麼可以變為如下兩個:xi – xj >= k, xi – xj <= k,進一步變為xj – xi >= -k,建立兩條邊即可。

(2)、如果求取的是最大值,那麼求取最短路,將不等式全部化成xi – xj <= k的形式, 這樣建立j->i的邊,權值為k的邊,如果像上面的兩種情況,那麼同樣地標準化就行了。

(3)、如果要判斷差分約束系統是否存在解,一般都是判斷環,選擇求最短路或者最長路求解都行,只是不等式標準化時候不同,判環地話,用spfa即可,n個點中如果同乙個點入隊超過n次,那麼即存在環。

值得注意的一點是:建立的圖可能不聯通,我們只需要加入乙個超級源點,比如說求取最長路時圖不聯通的話,我們只需要加入乙個點s,對其他的每個點建立一條權值為0的邊圖就聯通了,然後從s點開始進行spfa判環。最短路類似。

3、  建好圖之後直接spfa或bellman-ford求解,不能用dijstra演算法,因為一般存在負邊,注意初始化的問題。

#include #include #include #include #include #include #include #include #include #include #define inf 0x3f3f3f3f

using namespace std;

const int maxn = 10005;

const int maxm = 1000050;

int n = maxn, m, s, t; //n為點數 s為源點

int head[maxn]; //head[from]表示以head為出發點的鄰接表表頭在陣列es中的位置,開始時所有元素初始化為-1

int d[maxn]; //儲存到源節點的距離,在spfa()中初始化

int cnt[maxn];

bool inq[maxn]; //這裡inq作inqueue解釋會更好,出於習慣使用了inq來命名,在spfa()中初始化

int nodep; //在鄰接表和指向表頭的head陣列中定位用的記錄指標,開始時初始化為0

int pre[maxn];

struct node es[maxm];

void init()

nodep = 0;

}void addedge(int from, int to, int weight)

bool spfa()}}

}}

return true;

}void putpath()

now = pre[now];

}while(!path.empty())

}int main()

while(k--)

for(int i = 1; i < n; i++)

s = 1;

t = n;

if(spfa())

else

}else

}return 0;

}

POJ 3169 差分約束

題意 好久沒做差分約束了,看到這道題第一想法是貪心 思路 差分約束 從i到i 1的距離 0 add i 1,i,0 對於互相討厭的牛從u到v的距離 d add v,u,d 對於互相喜歡的牛從u到v的距離 d add u,v,d 跑spfa就好了 順便判判dis 和入隊次數 by siriusren ...

poj3169 差分約束

關於差分約束,我強推這位大佬的部落格。題目是有的牛互相之間最多只能有乙個距離,有的牛最少要達到乙個距離。很容易寫出不等式,由於是要求最大值,所以是要化為小於等於號,求最短路。f i 表示i只牛在哪個位置 0 f b f a d f b f a d 等價於f a f b 0 f b f a d f a...

POJ 3169 差分約束

題意 n頭牛,按照編號從左到右排列,兩頭牛可能在一起,接著有一些關係表示第a頭牛與第b頭牛相隔最多與最少的距離,最後求出第一頭牛與最後一頭牛的最大距離是多少,如 果最大距離無限大則輸出 2,如果關係不能保證則輸出 1 題解 差分約束的入門題 差分約束就是如果dis b dis a c轉化為a到b建一...