差分約束系統 模板

2021-10-03 02:45:09 字數 914 閱讀 2971

先來理解一下:有乙個已經求好的dis最短路陣列,有一條邊x->y權值為w,那麼一定存在dis[y]<=dis[x]+w,即dis[y]-dis[x]<=w;

那麼什麼是差分約束系統呢,就是給我一些不等式,我可以用最短路的思想把他們轉化成圖(即差分約束系統),然後加乙個超級原點0,0到其他所有點的地方初始化為0以後,去求最短路,如果存在負權迴路,說明無解,否則求出了一組解。但是關鍵在於如何將題轉化成差分約束系統。

例題:#10087 「一本通 3.4 例 1」intervals

題意:給n個區間【a,b】和對應的n個數 c,每個區間至少要選出c個數,問一共至少選多少個數?

那麼轉化成數學模型就是用s[n ]表示0~n區間至少選取多少點,s[b]-s[a-1]>=c  ————> s[a-1]-s[b]<=-c;

還要注意乙個問題,必須將所有的點都連起來,讓他們有關係,防止出現矛盾,所以初始化圖:s[i]-s[i-1]<=1,s[i-1]-s[i]<=0;

s[i]-s[0]<=0,因為下標減了一,所以將整個區間向後挪一下,防止出現負的下標。

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

struct node

q;int maxx,dis[50022];

vectorv[50022];

void spfa()}}

}printf("%d\n",dis[n-1]-dis[9]);

return ;

}int main()

for(int i=10;i<=maxx;i++)

q.b=9,q.c=0;

v[0].push_back(q);

spfa();

}return 0;

}

差分約束系統 模板

差分約束系統 如果乙個系統由n個變數和m個約束條件組成,其中每個約束條件形如 xj xi bk i j 1,n k 1,m 則稱其為差分約束系統。例如如下的約束條件 x1 x2 0 x1 x5 1 x2 x5 1 x3 x1 5 x4 x1 4 x4 x3 1 x5 x3 3 x5 x4 3 全都是...

差分約束系統模板

差分約束系統 如果乙個系統由n個變數和m個約束條件組成,其中每個約束條件形如 xj xi bk i j 1,n k 1,m 則稱其為差分約束系統。例如如下的約束條件 x1 x2 0 x1 x5 1 x2 x5 1 x3 x1 5 x4 x1 4 x4 x3 1 x5 x3 3 x5 x4 3 上述過...

差分約束 模板

如果需要求的是兩個變數差的最大值,那麼需要將所有不等式轉變成 leq 的形式,建圖後求最短路 如果需要求的是兩個變數差的最小值,那麼需要將所有不等式轉化成 geq 的形式,建圖後求最長路。這是兩個最基本的規則 算是吧 差分約束的精髓就在於建圖,而這玩意兒個人感覺沒什麼好辦法,只能靠不停做題去找到那種...