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