先來理解一下:有乙個已經求好的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 的形式,建圖後求最長路。這是兩個最基本的規則 算是吧 差分約束的精髓就在於建圖,而這玩意兒個人感覺沒什麼好辦法,只能靠不停做題去找到那種...