洛谷1361 小M的作物(最小割)

2022-08-21 02:03:13 字數 1188 閱讀 8322

第一眼看有a,b兩個以為是二分圖,根據題目各種想辦法建邊,感覺還是弄不成。

推了好久才發現求的就是乙個最小割。

首先如果令m=0,那麼可以建這樣乙個圖:

當然貪心就可以了,最後選擇的方案也一定是取ai和bi中的較大值,算出來也正是這張圖的最小割,也是

最大流。

那如果m不為0呢?

我們舉乙個有兩個點的例子:

a表示全部選種a地,b表示全部選種b地。

將a,b到兩個點的容量設為inf,所以做最小割的時候一定不會去割inf的邊,所以這個圖的最小割就是這兩種作物不選用的最小值,用總值減去即可得到最大貢獻。

所以以此類推即可。

所以就是一道最小割嘛。

#includeusing namespace std;

const int maxn=2010;

const int maxm=1e6+10;

const int inf=0x3f3f3f3f;

int n,m,cnt,s,t,sum;

int head[maxn],depth[maxn],cur[maxn];

int nxt[maxm],to[maxm],w[maxm];

int a[maxn],b[maxn];

int read()

void add(int x,int y,int z)

void add(int x,int y,int z)

int bfs()

} }return 0;

}int dfs(int u,int flow)

} }return 0;

}int dinic()

return ans;

}int main()

for(int i=1;i<=n;++i)

m=read();

s=0,t=n+m+m+1;

for(int i=1;i<=n;++i)

for(int i=1;i<=m;++i)

} cout<

return 0;

}

洛谷1361 小M的作物(最小割)

洛谷 這是乙個比較實用的套路,很多題目都有用,而且這個套路難以口胡出來。考慮把每乙個附加貢獻重新建乙個點,然後向必需的點連邊,流量為val。然後直接種植的從源點向這個點連,流量為val。最後跑乙個最小割就可以了。includeusing namespace std const int n 50001...

洛谷P1361 小M的作物 最小割建模

題目大意 有n株植物,a,b兩塊田地,每株植物i,種在a田,可以獲得a i 的收益,種在b田,可以獲得b i 的收益。此外還存在m種額外收益,其中第i中額外收益可以這樣描述 如果集合u i 中的所有植物全部種在a田,那麼可以獲得exa i 的額外收益,如果集合u i 中的所有植物全部種在b田,那麼可...

洛谷 P1361 小M的作物 最大流最小割

題目大意 給出 n 個植物,每個植物種在 a 農場的收益是 a i 種在 b 農場的收益是 b i 再給出 m 組關係,每組中的所有植物如果都在 a 農場的話額外收益為 c1 如果同時在 b 農場的話額外收益為 c2,問如何種植可以使得收益最大 題目分析 每種植物的兩種選擇可以視為兩個集合,對於選擇...