小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個單位的作物,農場...