關於差分約束,我強推這位大佬的部落格。
題目是有的牛互相之間最多只能有乙個距離,有的牛最少要達到乙個距離。
很容易寫出不等式,由於是要求最大值,所以是要化為小於等於號,求最短路。
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...