本天的第二道題解。(感覺今天的題都很有價值呢)
那麼放送題目。
題目描述小k在mc裡面建立很多很多的農場,總共n個,以至於他自己都忘記了每個農場中種植作物的具體數量了,他只記得一些含糊的資訊(共m個),以下列三種形式描述:
農場a比農場b至少多種植了c個單位的作物,
農場a比農場b至多多種植了c個單位的作物,
農場a與農場b種植的作物數一樣多。
但是,由於小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」。
其實這就是一道差分約束的大水題啦
那麼我們這題的思路是什麼呢?
首先,根據題面,我們可以了解到三個不等式:
a-b>=c;
a-b<=c;
a==b;
那麼我們根據差分約束可以很容易的把其中的式子轉換成我們想要的--> b-a>=c!;
那麼我們就可以根據上面的幾個不等式來建圖了。
我們把一條從a到b的路上的權值記錄為從b到a的差值,跑一邊最短路就好了啊。
順便一提,這題不卡spfa耶!!興奮。
那麼,**放送時間到!!(請別介意陣列名稱和函式名,可能只是一種執念qaq)
#include#define inf 100000000#define n 10005
using
namespace
std;
intn,m;
inthead[n],ecnt,dis[n];
struct
edgeedge[n*3
];bool
vis[n];
inline
intread()
returna;}
void add(int u,int v,int
dis)
bool spfa(int
u) }
vis[u]=0
;
return1;
}int
main()
if(x==2
)
if(x==3
) }
for(int i=1;i<=n;i++)
if(!spfa(0))printf("
no\n");
else printf("
yes\n");
return0;
}
謝謝**!!
洛谷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個 以下列三種形式描述 但是,由於小k的記憶有些偏差,所以他想要知道存不存在一種情況,使得農場的種植作物數量與他記憶中的所有資訊吻合。輸入格式 第一行包括兩個整數 n 和 m,...