poj3169 差分約束

2021-09-27 06:35:00 字數 989 閱讀 1248

關於差分約束,我強推這位大佬的部落格。

題目是有的牛互相之間最多只能有乙個距離,有的牛最少要達到乙個距離。

很容易寫出不等式,由於是要求最大值,所以是要化為小於等於號,求最短路。

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] - f[b] <= -d;

也就是b連a權值是0

a連b權值是d

b連a權值是-d

然後直接套上去就可以了。判斷是否成立就是看有沒有乙個點進棧n次,進n次就是有環輸出-1,如果是f【n】的值是最大值那麼說明任意距離都可以輸出-2;

下面是**

#include#include#include#include#include#include#include#includeusing namespace std;

const int max_ = 1e7 + 7;

int n, head[max_], xiann = 1, ml,md;

inline int read()

while (ch >= '0'&&ch <= '9')

return s * f;

}struct k xian[max_];

inline void add_(int a, int b, int c)

int vis[max_], pan[max_], f[max_];

void spfa(int now) }}

} }}int main()

while (md--)

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

spfa(1);

if (f[n] == max_)

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

POJ 3169 差分約束

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

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