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

2021-10-07 12:57:14 字數 1567 閱讀 8829

題目大意:給出 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 容量的邊,保證不會出現...