題目傳送門
題意:有兩種關係,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...