洛谷P1993 小K的農場 解題報告

2021-08-28 06:46:17 字數 2059 閱讀 4679

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

3 1 2

1 1 3 1

2 2 3 2

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