洛谷P1993 小K的農場

2022-03-25 19:14:30 字數 2777 閱讀 7293

這道題的實質是差分約束。我們逐個分析。

設$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 2

3using

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 2

3using

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