小k在mc裡面建立很多很多的農場,總共n個,以至於他自己都忘記了每個農場中種植作物的具體數量了,他只記得一些含糊的資訊(共m個),以下列三種形式描述:
農場a比農場b至少多種植了c個單位的作物,
農場a比農場b至多多種植了c個單位的作物,
農場a與農場b種植的作物數一樣多。
但是,由於小k的記憶有些偏差,所以他想要知道存不存在一種情況,使得農場的種植作物數量與他記憶中的所有資訊吻合。
輸入格式:
第一行包括兩個整數 n 和 m,分別表示農場數目和小 k 記憶中的資訊數目。
接下來 m 行:
如果每行的第乙個數是 1,接下來有 3 個整數 a,b,c,表示農場 a 比農場 b 至少多種植了 c 個單位的作物。
如果每行的第乙個數是 2,接下來有 3 個整數 a,b,c,表示農場 a 比農場 b 至多多種植了 c 個單位的作物。如果每行的第乙個數是 3,接下來有 2 個整數 a,b,表示農場 a 種植的的數量和 b 一樣多。
輸出格式:
如果存在某種情況與小 k 的記憶吻合,輸出「yes」,否則輸出「no」。
input
3 3output3 1 2
1 1 3 1
2 2 3 2
yes說明
對於 100% 的資料保證:1 ≤ n,m,a,b,c ≤ 10000。
這是一道差分約束的模版(可能吧)題。
不難發現,其中給的條件就是滿足圖中的三角形不等式。
所以可以這樣建邊:
1、a-b≥c,建邊w[b,a]=cw[b,a]=c(表示a比b大c)
2、a-b≤c即b≥a−c,建邊w[a,b]=-cw[a,b]=−c(表示b比a小c,注意不能建邊w[b,a]=cw[b,a]=c,因為這和第乙個約束衝突,所以反過來就好了)
3、a==b時,建邊w[a,b]=w[b,a]=0,w[a,b]=w[b,a]=0(表示a和b相等)
然後跑一遍最長路
為什麼要跑最長路呢??
因為如果最長路都不會產生矛盾,那麼比這條路短的路徑也一定滿足!
就像:a-b>=c1
a-b>=c2
a-b>=c3
那麼a-b的最小值一定是c1,c2,c3中最大的那個!
強行模擬一下,圖中也應該是這樣的!
如果產生正環則說明有矛盾。
比如:a-b>=4;
b-c>=4;
c-a>=4;
3個式子相加,得0 >= 12;肯定不成立
建個圖試一下,這個差分約束肯定無法滿足,圖中一定有正環!
另外,因為這個圖不一定是聯通的
所以需要乙個超級原點
即從0向其他所有點連乙個正向圖和反向圖,邊權為0.
#include
using
namespace std;
#define maxn 50005
#define inf 23333333
int n,m;
struct edge
e[maxn]
;int dis[maxn]
,vis[maxn]
;int head[maxn]
,cnt;
inline
void
add(
int u,
int v,
int w)
bool
spfa
(int x)
} vis[x]=0
;return
true;}
intmain()
for(
int i=
1;i<=n;i++)if
(!spfa(0
))printf
("no\n");
else
printf
("yes\n");
return0;
}
洛谷P1993 小K的農場
小k在mc裡面建立很多很多的農場,總共n個,以至於他自己都忘記了每個農場中種植作物的具體數量了,他只記得一些含糊的資訊 共m個 以下列三種形式描述 但是,由於小k的記憶有些偏差,所以他想要知道存不存在一種情況,使得農場的種植作物數量與他記憶中的所有資訊吻合。輸入格式 第一行包括兩個整數 n 和 m,...
洛谷P1993 小K的農場
這道題的實質是差分約束。我們逐個分析。設 a 農場中有 d a 個單位植物,b 農場為 d b 對於第一點,則滿足 d a d b geq c 變形下就變成 d b d a leq c 對於第二點 d a d b leq c 對於第三點 d a d b 即 d a d b 0 變成不等式就要同時滿足...
洛谷 P1993 小K的農場
小k在mc裡面建立很多很多的農場,總共n個,以至於他自己都忘記了每個農場中種植作物的具體數量了,他只記得一些含糊的資訊 共m個 以下列三種形式描述 但是,由於小k的記憶有些偏差,所以他想要知道存不存在一種情況,使得農場的種植作物數量與他記憶中的所有資訊吻合。輸入格式 第一行包括兩個整數 n 和 m,...