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