bzoj 3436 小K的農場 差分約束系統

2021-08-14 10:41:23 字數 2304 閱讀 6339

【題目背景】

小k是個特麼喜歡玩mc的孩紙。。。

【題目描述】

小k在mc裡面建立很多很多的農場,總共n個,以至於他自己都忘記了每個農場中種植作物的具體數量了,他只記得一些含糊的資訊(共m個),以下列三種形式描述:農場a比農場b至少多種植了c個單位的作物,農場a比農場b至多多種植了c個單位的作物,農場a與農場b種植的作物數一樣多。但是,由於小k的記憶有些偏差,所以他想要知道存不存在一種情況,使得農場的種植作物數量與他記憶中的所有資訊吻合。

【輸入格式】

第一行包括兩個整數n和m,分別表示農場數目和小k記憶中的資訊的數目接下來m行:如果每行的第乙個數是1,接下來有三個整數a,b,c,表示農場a比農場b至少多種植了c個單位的作物如果每行第乙個數是2,接下來有三個整數a,b,c,表示農場a比農場b至多多種植了c個單位的作物如果每行第乙個數是3,接下來有兩個整數a,b,表示農場a種植的數量與b一樣。1<=n,m,a,b,c<=10000

【輸出格式】

如果存在某種情況與小k的記憶吻合,輸出」yes」,否則輸出」no」

【樣例輸入】

3 3

3 1 2

1 1 3 1

2 2 3 2

【樣例輸出】

yes

【樣例解釋】

三個農場種植的數量可以為(2,2,1)

【題目解析】

這道題是典型的差分約束系統,差分約束系統聽起來特別高大上。

如果乙個系統由n個變數和m個約束條件組成,形成m個形如ai-aj≤k的不等式(i,j∈[1,n],k為常數),則稱其為差分約束系統(system of difference constraints)。亦即,差分約束系統是求解關於一組變數的特殊不等式組的方法。(來自度娘)

我們處理起來分兩步:

1.建圖:

農場a比農場b至少多種植了c個單位的作物,我們可以簡單的寫a-b>=c,那麼我們add(a,b,-c),b是子節點,-c是邊權,那麼很好理解,a點到b點的代價是-c。我是這麼理解的:a農場到b農場得減少c個農作物,這樣,a農場的農作物的數量就和b農場一樣了,從某種意義上講,它就變成了b農場,到達了b農場。

農場a比農場b至多多種植了c個單位的作物,那我們簡單的寫a-b<=c,轉換一下,b-a>=-c,那麼我們add(b,a,c),理解如上。

相同就最好處理了,add(a,b,0)

2.判負環

我們用dfs版的spfa來處理

很好理解,因為spfa是求最短路,我們用dfs一路扎(遍歷)下去,把一路扎過的點標記一下,那麼如果我們又扎了回來,我們肯定陷入了乙個環裡,那麼就是不合法的,相當於你不停走這個環,最短路越來越小。(dfs來判環真的方便啊!!!雖然我理解了好久qwq)

下面附上我的**:

#include

#define maxn 10005

using namespace std;

bool ***,vis[maxn];

int n,e,tot,w[maxn],lnk[maxn],net[maxn],son[maxn],dis[maxn];

inline int

read()

while (ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar();

return ret*f;

}inline void add(int

x,int

y,int z)

inline void dfs(int

x)//發現扎回來了,就有問題了。

dis[son[j]]=dis[x]+w[j];

dfs(son[j]);}}

vis[x]=0;

}int main()

if (knd==2)

if (knd==3)

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

if (***) printf("no\n");else

printf("yes\n");

return

0;}

BZOJ 3436 小k的農場(差分約束)

description 背景 小k是個特麼喜歡玩mc的孩紙。描述小k在mc裡面建立很多很多的農場,總共n個,以至於他自己都忘記了每個農場中種植作物的具體數量了,他只記得一些含糊的資訊 共m個 以下列三種形式描述 農場a比農場b至少多種植了c個單位的作物,農場a比農場b至多多種植了c個單位的作物,農場...

BZOJ 3436 小K的農場 差分約束

原題鏈結 背景小k是個特麼喜歡玩mc的孩紙。描述小k在mc裡面建立很多很多的農場,總共n個,以至於他自己都忘記了每個農場中種植作物的具體數量了,他只記得 一些含糊的資訊 共m個 以下列三種形式描述 農場a比農場b至少多種植了c個單位的作物,農場a比農場b至多 多種植了c個單位的作物,農場a與農場b種...

BZOJ3436 小K的農場

差分約束系統。分析一下三種情況 1.農場a aa比農場b bb至少多種植了c cc個單位的作物 即a b c b a ca geq b c b leq a c a b c b a c,a aa向b bb連一條長度為 c c c的單向邊。2.農場a aa比農場b bb至多多種植了c cc個單位的作物。...