差分約束系統

2021-09-25 14:58:19 字數 1503 閱讀 8756

雖然蒜頭君並沒有多少錢,但是蒜頭君辦了很多張銀行卡,共有 nn 張,以至於他自己都忘記了每張銀行卡裡有多少錢了。

他只記得一些含糊的資訊,這些資訊主要以下列三種形式描述:

銀行卡 aa 比銀行卡 bb 至少多 cc 元。 

銀行卡 aa 比銀行卡 bb 至多多 cc 元。 

銀行卡 aa 和銀行卡 cc 裡的存款一樣多。 

但是由於蒜頭君的記憶有些差,他想知道是否存在一種情況,使得銀行卡的存款情況和他記憶中的所有資訊吻合。

輸入格式

第一行輸入兩個整數 nn 和 mm,分別表示銀行卡數目和蒜頭君記憶中的資訊的數目。(1\leq n,m\leq 10000)(1≤n,m≤10000)

接下來 mm 行:

如果每行第乙個數是 11,接下來有三個整數 a, b, ca,b,c,表示銀行卡 aa 比銀行卡 bb 至少多 cc 元。

如果每行第乙個數是 22,接下來有三個整數 a, b, ca,b,c,表示銀行卡 aa 比銀行卡 bb 至多多 cc 元。

如果每行第乙個數是 33,接下來有兩個整數 a, ba,b,表示銀行卡 aa 和 bb 裡的存款一樣多。(1\leq n,m,a,b,c\leq 10000)(1≤n,m,a,b,c≤10000)

輸出格式

如果存在某種情況與蒜頭君的記憶吻合,輸出yes,否則輸出no。

樣例輸入

3 3 

3 1 2 

1 1 3 1 

2 2 3 2 

樣例輸出

差分約束+spfa

**:

#includeusing namespace std;

const int max_n=10010;

const int max_m=2*max_n;

int ss=0;

int n,m;

struct edgee[max_m];

int p[max_n],eid;

int dst[max_n];

int cnt[max_n];

bool inq[max_n];

int inf=0x3f3f3f3f;

void init()

void insert(int u,int v,int w)

int spfa(int s)

} }return 1;

}int main()else if(id==2)else

} for(int i=1;i<=n;i++)

if(spfa(ss))else

return 0;

}

差分約束系統

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