洛谷 P1361 小M的作物

2021-10-08 18:36:48 字數 2110 閱讀 1827

有 nn

n 種作物,兩塊耕地 a

aa 和 bbb

第 i

ii 種作物種植在 a

aa 中收益為 a

ia_i

ai​,種植在 b

bb 中收益為 b

ib_i

bi​另有 m

mm 種組合,每種組合有 k

kk 種作物,如果這 k

kk 種作物共同種在 a

aa 中收益為 c1i

c1_i

c1i​

,共同種在 b

bb 中收益為 c2i

c2_i

c2i​

求種植的最大收益

把源點 s

ss 當作耕地 a

aa,源點 t

tt 當作耕地 bbb

s

ss 與每個作物 i

ii 之間建立一條權值為 a

ia_i

ai​ 的邊,每個作物 i

ii 與 t

tt 之間建立一條權值為 b

ib_i

bi​ 的邊,代表收益

顯然所有邊權和與最小割的差就是種植的最大收益

將每種組合拆成兩個點,設為 p,q

p,qp,

q,ss

s 與 p

pp 之間建立一條權值為 c

1c_1

c1​ 的邊,q

qq 與 t

tt 之間建立一條權值為 c

2c_2

c2​ 的邊,p,q

p,qp,

q 分別與該種組合中的 k

kk 個點建立一條邊權為正無窮的邊(這些正無窮的邊必不可能被割)

圖中 u,v

u,vu,

v 為某種組合中的兩個點

易發現最小割只有 ,,

,\,\,\,\

,,, 這四種情況

並且割去邊與剩餘邊(除權為正無窮)之間的存在關係與題意均符合

因此根據最大流最小割定理,求出最大流,即最小割,所有邊(除權為正無窮)的和與最小割的差即為最大收益

#

include

using

namespace std;

const

int n=

1e5+5;

int n,m,s,t,d[n]

,cur[n]

,cnt;

long

long sum;

vector

int,

long

long

>

> e;

vector<

int> g[n]

;void

init()

void

addedge

(int u,

int v,

long

long w)

bool

bfs()}

if(d[t]

)return

true

;return

false;}

long

long

dfs(

int u,

long

long a)

return flow;

}long

long

dinic()

return flow;

}int

main()

for(

int i=

1;i<=n;i++

)scanf

("%d"

,&m)

;for

(int i=

1;i<=m;i++

) cnt+=2;

sum+=w1+w2;

} n+=

2+cnt;

printf

("%lld\n"

,sum-

dinic()

);return0;

}

題解 洛谷P1361 小M的作物

有兩塊容量為無限大的耕地a,b。對於每一種種子,種在a裡的收益為ai,種在b裡的收益為bi。特別地,對於m種組合,如果組合中的種子全部種在a裡,可以獲得c1的額外收益,全部種在b裡則可以獲得c2的額外收益。求最大的收益。我們考慮對於一種種子要不在a地,要不在b地。當我們取其中一種情況時,就要把另一種...

P1361 小M的作物

p1361 小m的作物 二者取其一型別的網路流題 不同的集合,向對應元素連去不同 收益 容量的邊 對於那些神奇的組合,我們只需要按照以下方式建立兩個點 x 向 s 連一條在a時的額外收益 2.x x 注意順序,x 是其有向邊的起點,x 是其有向邊的終點 向其後繼節點連 inf 容量的邊,保證不會出現...

P1361 小M的作物

小m在mc裡開闢了兩塊巨大的耕地a和b 你可以認為容量是無窮 現在,小p有n中作物的種子,每種作物的種子有1個 就是可以種一棵作物 用1.n編號 現在,第i種作物種植在a中種植可以獲得ai的收益,在b中種植可以獲得bi的收益,而且,現在還有這麼一種神奇的現象,就是某些作物共同種在一塊耕地中可以獲得額...