小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。
思路:設d[i]表示第i個點的數值。
那麼對於約束
1:d[a]-d[b]>=c
2:d[a]-d[b]<=c
3:d[a]=d[b]
讓我們稍微變化一下式子
1:d[b]<=d[a]-c
2:d[a]<=d[b]+c
3:d[a]<=d[b]+0,d[b]<=d[a]+0
這不是和最短路中dist的定義很像嗎?每個點的距離都小於等於能到他的點的距離+邊權。
於是我們將其轉化成乙個最短路模型。
對於約束
1:我們連邊(a,b,-c).
2:我們連邊(b,a,c).
3:我們連邊(a,b,0),(b,a,0)。
因為d[i]>=0,所以我們建乙個起點s,向所有點連一條(s,i,0)的邊。
然後d[s]顯然=0.
我們發現這樣子跑乙個最短路就能確定每個點的d值啦
那什麼時候是無解呢?當然是無法確定每個點的最短路的時候,也就是圖中存在負權環。
我們建完圖以後判斷是否存在負權環就可以啦。
#include#include#include
#include
#include
#define maxn 100010
using
namespace
std;
queue
que;
intn,m,tot,flag;
intdis[maxn],vis[maxn];
intto[maxn],cap[maxn],net[maxn],head[maxn];
void add(int u,int v,int
w)void spfa(int
x) spfa(to[i]);
}vis[x]=0;}
intmain()
else
if(opt==2
) else
if(opt==3
) }
for(int i=1;i<=n;i++) add(0,i,0
); memset(dis,
0x7f,sizeof
(dis));
dis[
0]=0;spfa(0
);
if(flag) printf("no"
);
else printf("
yes"
); }
/*3 3
3 1 2
1 1 3 1
2 2 3 2
*//*
10 10
3 9 5
1 6 1 1
1 2 8 0
1 2 8 1
2 4 5 0
1 1 2 1
1 10 5 0
1 10 1 0
2 6 7 0
2 9 3 0
*/
洛谷P1993 小K的農場
小k在mc裡面建立很多很多的農場,總共n個,以至於他自己都忘記了每個農場中種植作物的具體數量了,他只記得一些含糊的資訊 共m個 以下列三種形式描述 但是,由於小k的記憶有些偏差,所以他想要知道存不存在一種情況,使得農場的種植作物數量與他記憶中的所有資訊吻合。輸入格式 第一行包括兩個整數 n 和 m,...
洛谷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個 以下列三種形式描述 農場a比農場b至少多種植了c個單位的作物,農場a比農場b至多多種植了c個單位的作物,...