P1993 小K的農場

2022-03-04 06:08:03 字數 1785 閱讀 8593

小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 3

3 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,...