time limit: 10 sec
memory limit: 128 mb
submit: 1200
solved: 521 [
submit][
status][
discuss]背景
小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 33 1 2
1 1 3 1
2 2 3 2
yes樣例解釋
三個農場種植的數量可以為(2,2,1)
kpmcup#0 by greens [
submit][
status][
discuss]
對於每個約束,總是可以轉換成ai - bi <= ci的形式
那這就是典型的差分約束了--
然後這題我們只需要知道其可行性
新增乙個輔助點,從它到[1,n]的點都連一條權值為0的邊,在這張圖上用spfa判有無負環即可
判負環的話,,spfa寫成dfs的形式比較方便
#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
const int maxn = 1e4 + 10;
const int inf = ~0u>>1;
struct e
e(int to,int w): to(to),w(w){}
};int n,m,dis[maxn];
bool vis[maxn];
vector v[maxn];
bool spfa(int x)
} return 1;
}int main()
for (int i = 1; i <= n; i++) v[0].push_back(e(i,0)),dis[i] = inf;
vis[0] = 1; if (!spfa(0)) puts("no"); else puts("yes");
return 0;
}
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向...
BZOJ 3436 小K的農場
time limit 10 sec memory limit 128 mb submit 938 solved 417 submit status discuss 背景小k是個特麼喜歡玩mc的孩紙。描述小k在mc裡面建立很多很多的農場,總共n個,以至於他自己都忘記了每個農場中種植作物的具體數量了,他...