洛谷P1993 小K的農場 差分約束系統

2022-04-30 09:33:11 字數 1808 閱讀 4171

題目傳送門

小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:dis[a]\geq dis[b]+c$

$2:dis[b]\geq dis[a]-c$

$3:dis[a]\geq dis[b]+0,dis[b]\geq dis[a]+0$

其中第三種條件可以放心建邊,因為題目本身的要求就只是檢視是否有負環就行了,只要無負環就輸出$yes$,有負環就輸出$no$。因為是判斷負環,所以用$dfs$版$spfa$(一開始打了個$bfs$版,然後死活要$wa$乙個點。。。。)。

code:

//

it is made by holselee on 21st aug 2018

p1993

#include#include

#include

#include

#include

#include

#include

#include

#include

#define max(a,b) (a)>(b)?(a):(b)

#define min(a,b) (a)<(b)?(a):(b)

using

namespace

std;

const

int n=1e4+7

;int

n,m,dis[n],tim[n];

bool

vis[n],flag;

struct

node

};vector

e[n];

queue

team;

inline

intread()

while(ch>='

0'&&ch<='9')

return flag?-num:num;

}void spfa(int

u) }

vis[u]=false;}

intmain()

}flag=true

;

for(int i=1;i<=n;++i)

if(flag)printf("

yes\n");

else printf("

no\n");

return0;

}

洛谷P1993 小K的農場 差分約束

對於n nn個物品,給出m mm個限制關係,分別是 1.a aa比b bb至少多種c cc單位的作物。2.a aa比b bb至多多種c cc單位的作物。3.a aa和b bb的作物數相等。求問是否滿足這樣的一種情形,符合所有的限制關係。不妨記f f f 表示 的作物數,顯然各條件等價於 1.f a ...

洛谷P1993 小K的農場 差分約束

小k在mc裡面建立很多很多的農場,總共n n個,以至於他自己都忘記了每個農場中種植作物的具體數量了,他只記得一些含糊的資訊 共m m個 以下列三種形式描述 但是,由於小k的記憶有些偏差,所以他想要知道存不存在一種情況,使得農場的種植作物數量與他記憶中的所有資訊吻合。顯然差分約束。條件1 a b c ...

洛谷P1993 小K的農場

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