ssoj1750小K 的農場(差分約束系統)

2021-07-05 08:22:24 字數 1365 閱讀 1425

小k 是個特麼喜歡玩mc 的孩紙。。。

小k 在mc 裡面建立很多很多的農場,總共n 個,以至於他自己都忘記了每個農場中種植作物的具體數量了,他只記得一些含糊的資訊(共m 個),以下列三種形式描述:

農場a 比農場b 至少多種植了c 個單位的作物,農場a 比農場b 至多多種植了c 個單位的作物,農場a 與農場b 種植的作物數一樣多。但是,由於小k 的記憶有些偏差,所以他想要知道存不存在一種情況,使得農場的種植作物數量與他記憶中的所有資訊吻合。

第一行包括兩個整數n 和m,分別表示農場數目和小k 記憶中的資訊的數目

接下來m 行:

如果每行的第乙個數是1,接下來有三個整數a,b,c,表示農場a 比農場b 至少多種植了c 個單位的作物

如果每行第乙個數是2,接下來有三個整數a,b,c,表示農場a 比農場b 至多多種植了c 個單位的作物

如果每行第乙個數是3,接下來有兩個整數a,b,表示農場a 種植的數量與b一樣多

如果存在某種情況與小k 的記憶吻合,輸出「yes」 ,否則輸出「no」

3 33 1 21 1 3 12 2 3 2

yes【樣例解釋】三個農場種植的數量可以為(2,2,1)。

【資料範圍與約定】

對於10%的資料,1 <= n ,m<= 10

對於100%的資料,1 <= n,m,a,b,c <= 10000

#include #include #include #include #include #include #include using namespace std;

const int maxn=100005;

const int inf=1000000009;

struct datae[maxn*2];

int n,m,cnt=0;

int dis[maxn],tim[maxn],fst[maxn];

bool vis[maxn],f=1;

inline int get()

inline void add(int x,int y,int z)

queueq;

inline void spfa()

if(dis[y]>dis[x]+e[i].w)

}if(!f)break;

}}int main()

for(int i=1;i<=n;++i)add(n+1,i,0),dis[i]=inf;

spfa();

if(f)printf("yes\n");

else printf("no\n");

return 0;

}

思路:典型的差分約束系統。易知有負環時方案不存在.

注意:(1)由於0邊和源點多連了邊,所以maxn要開大一點。

小K的農場 差分約束

description背景 小k是個特麼喜歡玩mc的孩紙。描述小k在mc裡面建立很多很多的農場,總共n個,以至於他自己都忘記了每個農場中種植作物的具體數量了,他只記得一些含糊的資訊 共m個 以下列三種形式描述 農場a比農場b至少多種植了c個單位的作物,農場a比農場b至多多種植了c個單位的作物,農場a...

小K的農場(差分約束,spfa)

小k在mc裡面建立很多很多的農場,總共n個,以至於他自己都忘記了每個農場中種植作物的具體數量了,他只記得一些含糊的資訊 共m個 以下列三種形式描述 但是,由於小k的記憶有些偏差,所以他想要知道存不存在一種情況,使得農場的種植作物數量與他記憶中的所有資訊吻合。輸入格式 第一行包括兩個整數 n 和 m,...

BZOJ 3436 小k的農場(差分約束)

description 背景 小k是個特麼喜歡玩mc的孩紙。描述小k在mc裡面建立很多很多的農場,總共n個,以至於他自己都忘記了每個農場中種植作物的具體數量了,他只記得一些含糊的資訊 共m個 以下列三種形式描述 農場a比農場b至少多種植了c個單位的作物,農場a比農場b至多多種植了c個單位的作物,農場...