洛谷P1993 小K的農場

2021-08-17 11:45:14 字數 1606 閱讀 5089

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

頭一次做差分約束。。。

首先轉化題目:

1:表示農場 a 比農場 b 至少多種植了 c 個單位的作物。即a>=b+c 轉化後為 b-a<=-c,即從a向b連一條權值為-c的邊

2:表示農場 a 比農場 b 至多多種植了 c 個單位的作物。即a<=b+c 轉化後為 a-b<=c,即從b向a

連一條c的邊

3:表示農場 a 與農場 b 種植數一樣 即a=b 可以表示為 a-b<=0 與 b-a<=0,即 a、b之間連一條權值為0的雙向邊;

接下來就是判負環了,用 **師(dfs) 跑 spfa!

附**:

#include#include#include#define maxn 10010

#define max 999999999

using namespace std;

int n,m,c=1,s;

int head[maxn],path[maxn];

bool flag=false,vis[maxn];

struct nodea[maxn<<2];

inline int read()

while(c>='0'&&c<='9')

return date*w;

}inline int relax(int u,int v,int w)

return 0;

}inline void add(int u,int v,int w)

void spfa(int u)

else spfa(v);

} }vis[u]=false;

}void work()

spfa(0);

if(!flag)printf("yes\n");

else printf("no\n");

}void init()

case 2:

case 3:}}

}int main()

洛谷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,...

洛谷 P1993 小K的農場

本天的第二道題解。感覺今天的題都很有價值呢 那麼放送題目。題目描述 小k在mc裡面建立很多很多的農場,總共n個,以至於他自己都忘記了每個農場中種植作物的具體數量了,他只記得一些含糊的資訊 共m個 以下列三種形式描述 農場a比農場b至少多種植了c個單位的作物,農場a比農場b至多多種植了c個單位的作物,...