題意:n頭牛,按照編號從左到右排列,兩頭牛可能在一起,接著有一些關係表示第a頭牛與第b頭牛相隔最多與最少的距離,最後求出第一頭牛與最後一頭牛的最大距離是多少,如 果最大距離無限大則輸出-2,如果關係不能保證則輸出-1
題解:差分約束的入門題
差分約束就是如果dis[b]-dis[a]<=c轉化為a到b建一條有向邊權值為c,接著求最短路就得出了兩點的最大距離(最短距離都保證了,那麼長一些的也可以成立),注意沒有 最短路就是可能性無限,有一個負權迴路就是關係不能保證,但是這個題要注意隱含條件就是需要建立每頭牛一定不在前一頭牛的前面這些邊
#include#includeconst
int inf=0x3f3f3f3f
;const
int maxn=50010
;struct
edge
edge() {}
};struct
edge belledge[maxn];
intdis[maxn];
void bellman(int s,int n,int
m) dis[s]=0
;
intflag;
for(int i=0; ii)
}if(flag)//
無法再次鬆弛
return
; }
if(!flag&&dis[n]//
最後依然可以鬆弛就是存在負權迴路
dis[n]=-1;}
intmain()
for(int i=0; ii)
for(int i=1; ii)
bellman(
1,n,m);
if(dis[n]==inf) //
無限解
else
if(dis[n]==-1) //
負權迴路無解
else
}return0;
}
POJ 3169 Layout 差分約束
題意 有n頭牛,這些牛都擁有一個屬性x表示其在座標軸上的座標。現在給定ml組約束條件表示a b兩頭牛座標之差不能夠超過c md組約束條件表示a b兩頭牛座標之差不能小於c,現在問1和n號牛之間最長的距離為多大,如果存在則輸出最大長度,如果任意輸出 2,如果已知條件存在矛盾輸出 1。 解法 根據已知條...
POJ 3169 Layout (差分約束)
差分約束 形如 x1 x2 a,x1 x3 b,x2 x3 c 出現這樣式子便要用到差分約束加最短路了。當要求 x1與x3 的最大差值時要用到最短路,所有的式子要轉換成 x1 x2 a 的形式,當求最小值時用最長路,所有式子轉換為 x1 x2 a 的形式。至於建圖則需要根據題意確定邊的方向。 題目大...
POJ3169 Layout 差分約束)
題意 一堆牛在一條直線上按編號站隊 在同一位置可以有多頭牛並列站在一起 但編號小的牛所佔的位置不能超過編號大的牛所佔的位置 這裡用d i 表...