差分約束系統

2022-09-05 00:12:25 字數 2898 閱讀 4905

簡單來說,差分約束是用圖論中的最短路解決一些不等式(組)。

例如:xi表示序列第i個數,請求出一組滿足:x1-x5

<= 1, x1 - x3

<= 3, x2 - x4

<= -2的長度為5的序列

怎麼建圖?舉個栗子,x1-x5

<= 1, 就從結點5向結點1連一條權為1的邊。

x1-x5

<= 1  ->  x1

<= x5 + 1

聯想到最短路的性質:dis(i) <= dis(j) + edge(j, i).(dis_i是源點到i距離)

兩個一一對應一下,把x1看成dis(1),x5看成dis(5),1就是這兩個結點連出的邊權,因此對於每一對xi - xj <= wk, 就從j到i連一條權是wk的邊即可。

為了圖的連通性(為了有個源點)最後再新建乙個結點0,連到每個結點,長度是0(即xi<=x0+0,因為x0不是題目中的結點,所以隨意約定它的值不會影響答案)

從結點0跑單源最短路,滿足這一系列不等式的的序列就是最後的dis(1) 到 dis(n)。

圖中有負環時無解

剛剛講的是xi - xj <= wk的形式,直接j到i連一條權為wk,如果是 xi - xj >= wk 的話,兩邊乘以-1,轉換成xj - xi <= -wk,所以最後的方法是:i到j連一條權為-wk的邊。

如果是xi - xj = wk 呢?我們就建兩條邊,分別是xi - xj ≥ wk ,xi - xj ≤ wk。

;}這類題又有些微的不同,sum(n)是前n個單位種的樹的棵樹,好比字首和,所以sum(k+1)一定大於等於sum(k)

1.sum(k+1) ≤ sum(k)

2.sum(k+1) - sum(k) ≤ 1

於是我們這樣建邊:

for(int i=1;i<=n;i++) add(i-1,i,1),add(i,i-1,0);
此時還能為了圖的連通將0與每個點相連嗎?

若建邊用add(0,i,0),則按照題意就是 sum(i)  -sum(0) ≤ 0,這種建邊方式不適用於這種類似字首和的題。

於是我們只好選擇點 l+1以保持圖的連通。

for(int i=1;i<=n;i++) add(n+1,i,0);
最後,我們要求的是種最少的棵數,然而我們求出的關係是相對的。

舉個栗子,3,4,5,9,2是一種方案,那麼1,2,3,7,0是同樣成立的。

於是我們最後要求的最少個數需要減去最小值

for(int i=0; i<=n; i++) minn =min(minn, dis[i]);

cout

<< dis[n] - minn << endl;

某些粉絲之間互相喜歡,他們希望互相之間的距離至多為乙個定值。但某些粉絲乊間互相厭惡,他們希望互相之間的距離至少為乙個定值。現在給定k個互相喜愛的粉絲對以及他們乊間距離的最大值,l個互相厭惡的粉絲對以及他們之間距離的最小值。

你的任務是計算在滿足以上條件的前提下,幫劣ysy計算出編號為1和編號為n的粉絲乊間距離的最大可能值。

【輸入】

輸入檔案為 layout.in。

第一行有 3 個整數,每兩個整數之間用乙個空格隔開,依次表示 n,k和l ;

此後k行,每行包含三個用空格分開的整數a, b和d,其中a,b滿足1<=a<=b<=n。表示編號為a和b的粉絲之間的距離至多為d。

此後l行,每行包含三個用空格分開的整數a,b和d,其中a,b滿足1<=a<=b<=n。表示編號為a和b的粉絲之間的距離至少為d。

【輸出】

輸出檔名為 layout.out。

輸出檔案僅包含乙個整數。如果丌存在任何吅法的排隊方式,就輸出-1。如果編號1和編號n的粉絲間距離可以任意,就輸出-2 。否則輸出他們之間的最大可能距離。

【輸入輸出樣例】

layout.in

4 2 1

1 3 10

2 4 20

2 3 3

layout.out

【資料範圍】

對於40%的資料,n<=100;

對於100%的資料,n<=1000;k, l<=10000;d<=1000000。

此題和上兩題又不一樣了,前兩題不需要連通,那麼我們新加乙個點,連線每乙個點以保證連通。

題意中「如果編號1和編號n的粉絲間距離可以任意,就輸出-2」,說明圖必須連通,所以我們只能選擇現有的點。

for(int i=1;i<=n;i++) add(i,i-1,0);//

sum(i)>=sum(i-1)

if(!spfa(1)) printf("-1"

);else

if(vis[n] == 0)printf("-2"

);else printf("

%lld

",dis[n]);

差分約束系統

差分約束 若 s a s b k 建一條b到a 的長度為k的邊 若s a s b k 建一條b到a 的長度為 k的邊 是求最小值的最長路 是求最大值的最短路 注意到最短路演算法的鬆弛操作 if d j d i w i j d j d i w i j 這其中的三角形不等式 d j d i w i j ...

差分約束系統

差分約束系統 對於差分不等式,a b c 建一條 b 到 a 的權值為 c 的邊,求的是最短路,得到的是最大值 對於不等式 a b c 建一條 b 到 a 的權值為 c 的邊,求的是最長路,得到的是最小值 存在負環的話是無解 求不出最短路 dist 沒有得到更新 的話是任意解 第三 一種建圖方法 設...

差分約束系統

差分約束系統 x1 x2 0 x1 x5 1 x2 x5 1 x3 x1 5 x4 x1 4 x4 x3 1 x5 x3 3 x5 x4 3 不等式組 1 全都是兩個未知數的差小於等於某個常數 大於等於也可以,因為左右乘以 1就可以化成小於等於 這樣的不等式組就稱作差分約束系統。這個不等式組要麼無解...