差分約束系統 POJ 3169 Layout

2022-05-21 09:31:58 字數 1154 閱讀 1359

題目傳送門

題意:有兩種關係,n牛按照序號排列,a1到b1的距離不超過c1, a2到b2的距離不小於c2,問1到n的距離最大是多少.如果無限的話是-2, 如果無解是-1

分析:第一種可以寫這樣的方程:d[v] - d[u] <= w1, u到v連一條權值為w1的邊,第二種這樣:d[v] - d[u] >= w2 => d[u] - d[v] <= -w2,v到u連一條-w2的邊.當然根據題目還有i+1 到 i連權值0的邊.最短路就是為了d[v] <= d[u] + w[u][v], 也就是d[v] - d[u] <= ans.求出最短路也就是滿足了所有方程的約束條件.如果inf無解,如果負環無數解,否則就是ans了.

//#include #include #include #include #include using namespace std;

const int n = 1e3 + 5;

const int e = 2e4 + 5;

const int inf = 0x3f3f3f3f;

struct edge

edge(int v, int w, int nex) : v (v), w (w), nex (nex) {}

}edge[e*2];

int head[n];

int d[n];

bool vis[n];

int cnt[n];

int n, m1, m2, e;

void init(void)

void add_edge(int u, int v, int w)

bool spfa(int s)

}} }

return false;

}int main(void)

for (int u, v, w, i=1; i<=m1; ++i)

for (int u, v, w, i=1; i<=m2; ++i)

if (spfa (1)) puts ("-1");

else

}if (!ok) puts ("-2");

else printf ("%d\n", d[n]);

} }

return 0;

}

poj3169(差分約束系統)

大概題意 有n個點,其中有ml個限制條件 點a,點b,的最長距離為d,有md個限制條件,點a,點b,的最短距離為d 點按序號順序排,求第乙個點到最後乙個點的最長距離。解題思路 差分約束,其實我也不太清楚什麼是差分約束,大概就是將各種限制條件,逐個加入,先假設n個點間的距離都為無窮大,然後,按下列順序...

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