POJ3169 Layout 差分約束)

2022-02-20 17:08:47 字數 1452 閱讀 1150

題意:一堆牛在一條直線上按編號站隊,在同一位置可以有多頭牛並列站在一起,但編號小的牛所佔的位置不能超過編號大的牛所佔的位置,這裡用d[i]表示編 號為i的牛所處的位置,即要滿足d[i]-d[i+1]<=0,同時每兩頭牛之間有以下兩種關係(對於輸入的a b d來說):

1>如果是喜歡關係:即需要滿足d[b]-d[a]<=d

2>如果是討厭關係:即需要滿足d[b]-a[a]>=d ……> d[a]-d[b]<=-d

由於題目要求隊伍的最大可能長度,即求滿足以下三個約束條件的最大值,,由於此處是求最大值,故用bellman_ford演算法求約束圖的最短路徑.

1>對於ml有:d[b]-d[a]<=d

2>對於md有:d[a]-d[b]<=-d

3>對於n個頂點的約束圖有:s[i]-s[i+1]<=0(隱含條件)

題目的解為:有負環輸出-1,d[n]無窮大輸出-2,其他輸出dist[n].

在差分約束系統中如果題目要求是求最小值,就將約束條件轉化為">="形式,然後用bellman_ford演算法求解約束圖的最長路徑,如果題目要

求的是最大值,就將約束條件轉化為"<="形式,然後用bellman_ford演算法求解約束圖的最短路徑.

ps:(1)inf不能開得太大,可能會溢位;

(2)陣列盡量開小,不然會比較慢

如果有負環,輸出-1,如果n可以無限遠,即1與n不連通,輸出-2,其他情況輸出1與n的最大距離。(最短路)

#include #include 

#include

#include

#include

#define n 1000001

using

namespace

std;

intn,m,k,tt;

int head[1001],v[1001],dis[1001

];struct

node

q[1000001

];void

init()

void add(int xx,int yy,int

zz)void

spfa()

dis[

1]=0

; v[

1]=1

; queue

p;p.push(1);

while(!p.empty())

if(!v[q[i].y])}}

}if(dis[n]==n) printf("

-2\n

");//

1到n沒有路

else printf("

%d\n

",dis[n]);

return;}

intmain()

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

for(int i=1; i//

隱含條件

spfa();

}return0;

}

POJ 3169 Layout(差分約束)

題目大意 當排隊等候餵食時,奶牛喜歡和它們的朋友站得靠近些。fj有n 2 n 1000 頭奶牛,編號從1到n,沿一條直線站著等候喂 食。奶牛排在隊伍中的順序和它們的編號是相同的。因為奶牛相當苗條,所以可能有兩頭或者更多奶牛站在同一位置上。即使說,如果我們想象奶牛是站在一條數軸上的話,允許有兩頭或更多...

POJ3169 Layout 差分約束

題目鏈結。分析 對於任意i號奶牛,1 id i 1 d i 0 對於每個好感的描述 i,j,k 假設i j,體現到距離上的要求就是 d j d i k 對於每個反感的描述 i,j,k 假設i j,體現到距離上的要求就是 d j d i k 寫成我們約定的形式 d i d i 1 0 d j d i ...

POJ 3169 Layout 差分約束

題意 有n頭牛,這些牛都擁有乙個屬性x表示其在座標軸上的座標。現在給定ml組約束條件表示a b兩頭牛座標之差不能夠超過c md組約束條件表示a b兩頭牛座標之差不能小於c,現在問1和n號牛之間最長的距離為多大,如果存在則輸出最大長度,如果任意輸出 2,如果已知條件存在矛盾輸出 1。解法 根據已知條件...