小k在mc裡面建立很多很多的農場,總共n個,以至於他自己都忘記了每個農場中種植作物的具體數量了,他只記得一些含糊的資訊(共m個),以下列三種形式描述:
但是,由於小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」。
輸入樣例#1:
3 33 1 2
1 1 3 1
2 2 3 2
輸出樣例#1:
yes
對於 100% 的資料保證:1 ≤ n,m,a,b,c ≤ 10000。
solution:
本題還是差分約束。。。
因為這道題只需判斷存在性,所以只要任意情況成立就好了,顯然圖中有環時則不存在(類似$a>b,b>c,c>a$的情況)
那麼我們還是先羅列一下約束條件:
1、$a-b\geq c$,建邊$w[b,a]=c$(表示$a$比$b$大$c$)
2、$a-b\leq c$即$b\geq a-c$,建邊$w[a,b]=-c$(表示$b$比$a$小$c$,注意不能建邊$w[b,a]=c$,因為這和第乙個約束衝突,所以反過來就好了)
3、$a==b$時,建邊$w[a,b]=w[b,a]=0$(表示$a$和$b$相等)
然後從$0$向$i=1\rightarrow n$每個點連邊$w[0,i]=0$(隨便值為多少,反正只是驗證可行性)
最後跑$spfa$求最長路,出現環則輸出$no$,否則輸出$yes$。
(注意,直接廣蒐會$tle$,需要用$dfs$模擬$spfa$過程)
**:
#include#define il inline#define for(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
using
namespace
std;
const
int n=50005,inf=23333333
;int
n,m,to[n],net[n],w[n],dis[n],cnt,h[n],tot[n];
bool
vis[n];
il int
gi()
il void add(int u,int v,int c)
il bool spfa(int
u) vis[u]=0
;
return1;
}int
main()
for(i,
1,n)add(0,i,0),dis[i]=-inf;
if(!spfa(0))cout<<"no"
;
else cout<<"
yes"
;
return0;
}
P1993 小k的農場
小k在mc裡面建立很多很多的農場,總共n個,以至於他自己都忘記了每個農場中種植作物的具體數量了,他只記得一些含糊的資訊 共m個 以下列三種形式描述 但是,由於小k的記憶有些偏差,所以他想要知道存不存在一種情況,使得農場的種植作物數量與他記憶中的所有資訊吻合。第一行包括兩個整數 n 和 m,分別表示農...
P1993 小K的農場 題解
這是一道差分約束的題不會差分約束系統的人請往這邊走 差分約束系統,其形式非常像單源最短路的三角形不等式,所以已圖論演算法來列出方程 我是按求至少值得演算法來求的,求最大值相反 left a b geq c k 1 b a geq c k 2 a b geq 0,b a geq 0 k 3 end r...
洛谷P1993 小K的農場
小k在mc裡面建立很多很多的農場,總共n個,以至於他自己都忘記了每個農場中種植作物的具體數量了,他只記得一些含糊的資訊 共m個 以下列三種形式描述 但是,由於小k的記憶有些偏差,所以他想要知道存不存在一種情況,使得農場的種植作物數量與他記憶中的所有資訊吻合。輸入格式 第一行包括兩個整數 n 和 m,...