第一眼看有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,問如何種植可以使得收益最大 題目分析 每種植物的兩種選擇可以視為兩個集合,對於選擇...