題意: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 差分約束
題意 好久沒做差分約束了,看到這道題第一想法是貪心 思路 差分約束 從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 差分約束 bellman
include include using namespace std define maxn 1002 define inf 1000000000 typedef int elem t elem t mat maxn maxn elem t min maxn int bellman ford in...