有 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的收益,而且,現在還有這麼一種神奇的現象,就是某些作物共同種在一塊耕地中可以獲得額...