題目大意:給出 n 個植物,每個植物種在 a 農場的收益是 a[ i ] ,種在 b 農場的收益是 b[ i ] ,再給出 m 組關係,每組中的所有植物如果都在 a 農場的話額外收益為 c1 ,如果同時在 b 農場的話額外收益為 c2,問如何種植可以使得收益最大
題目分析:每種植物的兩種選擇可以視為兩個集合,對於選擇農場 a 和農場 b 這個條件我們可以將每個點與源點和匯點連邊,求一下最小割就能得到方案了,如果加上下面的那些組合的條件的話,需要我們建立虛點,大概如下圖所示
其中 st 表示源點,ed 表示匯點,點 a 和點 b 表示兩種植物,淺藍色的表示第乙個條件的建邊
x1 和 x2 為我們建立的虛點,目的是為了限流,兩條橙色的邊分別是 c1 和 c2 ,這樣不難發現,只有當與虛點相連的所有點都被分到同乙個集合時,才可能會保留下來一條橙色的邊,其他情況下兩條橙色的邊都是需要斷開的
我們為了只斷橙色的邊而不影響深藍色的邊,可以選擇將深藍色的邊賦值為無窮大
源點 -> 每個點,流量為 a[ i ]
源點 -> 虛點1,流量為 c1
虛點1 -> 相應的點,流量為 inf
相應的點 -> 虛點2,流量為 inf
虛點2 -> 匯點,流量為 c2
每個點 -> 匯點,流量為 b[ i ]
答案就是所有的 a[ i ] + b[ i ] + c1 + c2 之和減去最小割了
**:
#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const int n=3e3+100;
struct edge
edge[n*n];//邊數
int head[n],cnt;
void addedge(int u,int v,int w)
int d[n],now[n];//深度 當前弧優化
bool bfs(int s,int t)//尋找增廣路
} return false;}
int dinic(int x,int t,int flow)//更新答案
} now[x]=i;
return flow-rest;}
void init()
int solve(int st,int ed)
int main()
for(int i=1;i<=n;i++)
int m;
scanf("%d",&m);
for(int i=1;i<=m;i++) }
printf("%d\n",sum-solve(st,ed));
return 0;
}
洛谷 P1361 小M的作物
有 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 c1...
題解 洛谷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 容量的邊,保證不會出現...