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

2021-07-11 23:09:06 字數 1609 閱讀 2248

description

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

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

input 第一行包括兩個整數n和m,分別表示農場數目和小k記憶中的資訊的數目

接下來m行:

如果每行的第乙個數是1,接下來有三個整數a,b,c,表示農場a比農場b至少多種植了c個單位的作物 如果每行第乙個數是2,接下來有三個整數a,b,c,表示農場a比農場b至多多種植了c個單位的作物

如果每行第乙個數是3,接下來有兩個整數a,b,表示農場a種植的數量與b一樣多輸出格式

output

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

sample input

33 312 1131 2232

sample output

yes樣例解釋

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

對於100%的資料,1<=n,m,a,b,c<=10000

顯然,這是個差分約束的題…對於1、2、3,三種情況分類討論建樹,然後跑一遍spfa。一定要注意判負環的時候,在這裡用乙個vis陣列來進行判斷。(思路是利用spfa跑,每次跑對vis陣列內+1,如果大於n這個數,則是證明它已經形成了乙個環,直接return)

判負環**如下:

vis[u]=vis[x]+1;   //判負環 

if(vis[u]>n)

還有就是初始化,手殘打在了scanf的前面wawawawawawawa了好多遍(滿眼心酸淚)教訓啊qaq

好在最後在loi_a和小兔子學長的幫助下,最終調出來了!!!

下附**:

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn=20005;

struct dqs

hh[maxn];

int first[maxn],next[maxn],d[maxn],vist;

bool used[maxn];

int tot=0,n,m;

void build(int f,int t,int c )

int vis[maxn];

queue

q;void spfa(int s)}}

}

}}int main()

if(l==2)

if(l==3)

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

}cout

<<"yes";

return

0;

}

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個單位的作物。...

BZOJ 3436 小K的農場

題解 差分約束 模板題 差分約束系統 聯絡 最短路 對於操作1 a b geqslant c rightarrow b leqslant a c 也就是說a向b連一條 c的邊 對於操作2 a b leq c 也就是b向a連一條c的邊 對於操作三 a b leq 0 和 b a leq 0 也就是a向...