這道題的實質是差分約束。我們逐個分析。
設$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$,變成不等式就要同時滿足$d[a]-d[b] \leq 0$且$d[b]-d[a] \leq 0$。
根據一系列不等式組,即可構圖。
對於$d[u]-d[v] \leq w$,將$v$連一條有向邊到$u$,權值為$w$。
最後將$0$號結點連向每個結點,權值為$0$。
判斷整個圖是否有負環即可。
因為如果有負環,演算法將會無限制地執行鬆弛操作,也就是無法滿足不等式組成立,也就是輸出$"no"$。
1 #include 23using
namespace
std;45
#define re register
6#define rep(i, a, b) for (re int i = a; i <= b; ++i)
7#define repd(i, a, b) for (re int i = a; i >= b; --i)
8#define maxx(a, b) a = max(a, b);
9#define minn(a, b) a = min(a, b);
10#define ll long long
11#define inf (1 << 30)
1213 inline int
read()
1920
const
int maxn = 1e4 + 5, maxm = 1e4 + 5;21
22struct
edge ;
2526 queueq;
27int
inq[maxn], cnt[maxn];
28struct
graph
37void addedge(int u, int v, int
w) ;
39 g[u] =m;40}
41bool
spfa()
46 q.push(0), inq[0] = 1, dis[0] = 0;47
while (!q.empty()) 57}
58}59}
60return
true;61
}62} g;
6364
intn, m;
6566
intmain() else
76if (opt == 2
) else84}
85 rep(i, 1, n) g.addedge(0, i, 0
);86
87if (g.spfa()) printf("
yes"
);88
else printf("no"
);89
90return0;
91 }
該做法在本題中會$tle$,複雜度為$o(nm)$。
下面的方法把$spfa$改成了深搜的寫法,實質類似於將負權邊構成圖,單獨判斷是否有環。經驗證,比上面快幾十倍。
1 #include 23using
namespace
std;45
#define re register
6#define rep(i, a, b) for (re int i = a; i <= b; ++i)
7#define repd(i, a, b) for (re int i = a; i >= b; --i)
8#define maxx(a, b) a = max(a, b);
9#define minn(a, b) a = min(a, b);
10#define ll long long
11#define inf (1 << 30)
1213 inline int
read()
1920
const
int maxn = 1e4 + 5, maxm = 1e4 + 5;21
22struct
edge ;
2526
struct
graph
35void addedge(int u, int v, int
w) ;
37 g[u] =m;38}
39bool spfa(int
u) 48
}49 vis[u] = 0;50
return
true;51
}52} g;
5354
intn, m;
5556
intmain() else
66if (opt == 2
) else75}
76 rep(i, 1, n) g.addedge(0, i, 0
);77 memset(g.dis, ~0x3f, sizeof
(g.dis));
78 g.dis[0] = 0;79
if (g.spfa(0)) printf("
yes"
);80
else printf("no"
);81
82return0;
83 }
洛谷P1993 小K的農場
小k在mc裡面建立很多很多的農場,總共n個,以至於他自己都忘記了每個農場中種植作物的具體數量了,他只記得一些含糊的資訊 共m個 以下列三種形式描述 但是,由於小k的記憶有些偏差,所以他想要知道存不存在一種情況,使得農場的種植作物數量與他記憶中的所有資訊吻合。輸入格式 第一行包括兩個整數 n 和 m,...
洛谷 P1993 小K的農場
小k在mc裡面建立很多很多的農場,總共n個,以至於他自己都忘記了每個農場中種植作物的具體數量了,他只記得一些含糊的資訊 共m個 以下列三種形式描述 但是,由於小k的記憶有些偏差,所以他想要知道存不存在一種情況,使得農場的種植作物數量與他記憶中的所有資訊吻合。輸入格式 第一行包括兩個整數 n 和 m,...
洛谷 P1993 小K的農場
本天的第二道題解。感覺今天的題都很有價值呢 那麼放送題目。題目描述 小k在mc裡面建立很多很多的農場,總共n個,以至於他自己都忘記了每個農場中種植作物的具體數量了,他只記得一些含糊的資訊 共m個 以下列三種形式描述 農場a比農場b至少多種植了c個單位的作物,農場a比農場b至多多種植了c個單位的作物,...