POJ3169 差分約束系統 解題報告

2021-07-15 05:21:16 字數 2211 閱讀 5905

【問題描述】  

如果乙個系統由n個變數和m個約束條件組成,其中每個約束條件形如xj-xi≤bk(i,j∈[1,n],k∈[1,m]),則稱其為差分約束系統。亦即,差分約束系統是求解關於一組變數的特殊不等式組的方法。 

下面是關於差分約束系統乙個實際問題的描述: 

fj有 n 頭奶牛(編號從 1 到 n),沿一條直線站著等候餵食,由於奶牛們身材都比較苗條,所以可能有多頭奶牛站在同乙個位置的情況。設第i頭奶牛站隊位置為d[i],在安排每頭奶牛站隊位置d[i]時需要滿足如下的條件:

1、奶牛應按照編號順序站隊,即d[i]-d[i+1]<=0。

2、m對友好的牛希望彼此站的近些。即對於友好關係(i,j,d)有d[j]-d[i]≤d(1 ≤ i < j ≤ n)。

3、p對敵對的牛希望彼此站的遠些。即對於敵對關係(i,j,l)有d[j]-d[i]≥l(1 ≤ i < j ≤ n)。

現在請你幫助fj判斷是否存在滿足這些條件的一種站隊方案,如果存在請計算1號奶牛與n號奶牛之間的最大距離。如果不存在滿足要求的方案,輸出-1;如果1號奶牛和n號奶牛間的距離可以任意大,輸出-2; 

【輸入格式】  

第 1 行輸入 n,m,p,接下來的 m 行,每行三個整數 i,j,d,表示牛 i 和牛 j 的距離最多為 d,再接下來的 p 行,每行三個整數 i,j,l,表示牛 i 和牛 j 的距離最少為 l。

【輸出格式】  

如果不存在滿足要求的方案,輸出-1;如果1號奶牛和n號奶牛間的距離可以任意大,輸出-2;否則,計算出在滿足所有要求的情況下,1 號奶牛和 n 號奶牛間可能的最大距離。

【輸入樣例】   

4 2 1

1 3 10

2 4 20

2 3 3

【輸出樣例】  

27【樣例解釋】  

四隻奶牛的位置分別為:0,7,10,27

【資料範圍】  

2≤n≤1000  ,  1≤m,p≤10000  , 1≤d,l≤1000000

【**】  

poj3169

解題思路:根據題意,求差分約束系統的方法,就是將所給的資訊,轉化為圖,通過求最優路徑達到目的。那麼,怎麼將輸入的資訊有效地轉化為圖呢(重點,難點)?看到這麼多個不等式,不難想到求最短路徑時的三角圖的不等式——d[j]<=d[i]+c,將不等式變一下形可以得到d[j]-d[i]<=c,此時從i出發連了一條有向邊到j,同理,將題中所給的不等式變形成與上式一樣的形式,可以得到d[i]-d[i+1]<=0,d[j]-d[i]<=d,d[i]-d[j]<=-l,將這些不等式與上式模擬,則可以看成i+1到i連了一條邊權為0的有向邊,i到j連了一條邊權為d的有向邊,j到i連了一條邊權為-l的有向邊,至此,圖被我們建立了起來,問題由兩頭奶牛間的最大距離轉化為求圖上兩點的最短路徑(這裡解釋一下為什麼求的是最短路徑,因為根據三角圖關係d[j]<=d[i]+c,說明在滿足條件的情況下,d[j]最大可以取到d[i]+c)。需要注意的是,這裡要判斷是否存在滿足要求的方案及奶牛間的距離是否可以無限大,如果圖中存在負權迴路,則說明沒有滿足要求的方案,如果計算完最短路徑後d[n]的值仍為初始時的無窮大,則說明奶牛間的距離可以無限大。

int spfa(int s) //spfa演算法計算最短路徑並判斷是否有負權迴路

{ queueq;

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

d[i]=inf;

memset(inq,0,sizeof(inq));

memset(num,0,sizeof(num));

q.push(s);

inq[s]=1;

num[s]++;

d[s]=0;

while(!q.empty())

{ int i=q.front(); q.pop();

inq[i]=0;

for(int k=0;k

poj3169(差分約束系統)

大概題意 有n個點,其中有ml個限制條件 點a,點b,的最長距離為d,有md個限制條件,點a,點b,的最短距離為d 點按序號順序排,求第乙個點到最後乙個點的最長距離。解題思路 差分約束,其實我也不太清楚什麼是差分約束,大概就是將各種限制條件,逐個加入,先假設n個點間的距離都為無窮大,然後,按下列順序...

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...