題目傳送門
小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 33 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,...