差分約束系統

2022-04-14 13:31:41 字數 1479 閱讀 6357

如若乙個系統由n個變數和m個不等式組成,並且這m個不等式對應的係數矩陣中每一行有且僅有乙個1和-1,其它的都為0,這樣的系統稱為差分約束( difference constraints )系統。

題目描述

造一幢大樓是一項艱鉅的工程,它是由n個子任務構成的,給它們分別編號1,2,…,n(5≤n≤1000)。由於對一些任務的起始條件有著嚴格的限制,所以每個任務的起始時間t1,t2,…,tn並不是很容易確定的(但這些起始時間都是非負整數,因為它們必須在整個工程開始後啟動)。例如:挖掘完成後,緊接著就要打地基;但是混凝土澆築完成後,卻要等待一段時間再去掉模板。

這種要求就可以用m(5≤m≤5000)個不等式表示,不等式形如ti-tj≤b代表i和j的起始時間必須滿足的條件。每個不等式的右邊都是乙個常數b,這些常數可能不相同,但是它們都在區間(-100,100)內。

你的任務就是寫乙個程式,給定像上面那樣的不等式,找出一種可能的起始時間序列t1,t2,…,tn,或者判斷問題無解。對於有解的情況,要使最早進行的那個任務和整個工程的起始時間相同,也就是說,t1,t2,…,tn中至少有乙個為0。

輸入 第一行是用空格隔開的兩個正整數n和m,下面的m行每行有三個用空格隔開的整數i,j,b對應著不等式ti-tj≤b。

輸出如果有可行的方案,那麼輸出n行,每行都有乙個非負整數且至少有乙個為0,按順序表示每個任務的起始時間。如果沒有可行的方案,就輸出資訊「no solution」。

樣例輸入

5 81 2 0

1 5 -1

2 5 1

3 1 5

4 1 4

4 3 -1

5 3 -1

5 4 -3

樣例輸出02541

#include#define ll long long

#define inf 0x3f3f3f3f

using

namespace

std;

const

int n=1e5+50

;const

int p=1e9+7

;int

n,m,cnt;

intlast[n],d[n],ini[n];

struct

orze[n*5

];bool

vis[n];

void add(int u,int v,ints)

bool

spfa()}}

vis[now]=0

; }

return1;

} intmain()

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

);

if(spfa())

else printf("

no solution\n");

return0;

}

view code

差分約束系統

差分約束 若 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就可以化成小於等於 這樣的不等式組就稱作差分約束系統。這個不等式組要麼無解...