BZOJ3438小M的作物 最小割

2022-05-08 03:12:10 字數 1763 閱讀 4135

小m在mc裡開闢了兩塊巨大的耕地a和b(你可以認為容量是無窮),現在,小p有n中作物的種子,每種作物的種子

有1個(就是可以種一棵作物)(用1...n編號),現在,第i種作物種植在a中種植可以獲得ai的收益,在b中種植

可以獲得bi的收益,而且,現在還有這麼一種神奇的現象,就是某些作物共同種在一塊耕地中可以獲得額外的收益

,小m找到了規則中共有m種作物組合,第i個組合中的作物共同種在a中可以獲得c1i的額外收益,共同總在b中可以

獲得c2i的額外收益,所以,小m很快的算出了種植的最大收益,但是他想要考考你,你能回答他這個問題麼?

第一行包括乙個整數n

第二行包括n個整數,表示ai第三行包括n個整數,表示bi第四行包括乙個整數m接下來m行,

對於接下來的第i行:第乙個整數ki,表示第i個作物組合中共有ki種作物,

接下來兩個整數c1i,c2i,接下來ki個整數,表示該組合中的作物編號。輸出格式

只有一行,包括乙個整數,表示最大收益

34 2 1

2 3 2

12 3 2 1 2

11樣例解釋a耕地種1,2,b耕地種3,收益4+2+3+2=11。

1<=k< n<= 1000,0 < m < = 1000 保證所有資料及結果不超過2*10^9。

源匯點分別表示選擇種在$a$還是$b$上。將源點與每種作物連邊,流量為選$a$的收益;每種作物與匯點連邊,流量為$b$的收益。對於每種組合收益可以將它看成兩種:一種是選$a$的組合,一種是選$b$的組合。如果是選$a$的組合,新建乙個點,將源點連向新建點,流量為對應收益;再將新建點連向組合中所有點,流量為$inf$。如果是選$b$的組合,新建點連向匯點,流量為對應收益;再將組合中所有點連向新建點,流量為$inf$。答案就是總收益$-$最小割。由於邊數較多,需要$dinic$加上多種優化。

#include#include#include#include#include#include#include#include#include#include#include#define inf 0x3f3f3f3f

#define ll long long

using namespace std;

int head[4000];

int to[4000000];

int next[4000000];

int val[4000000];

int d[4000];

int q[4000];

int back[4000];

int s,t;

int x,y,k;

int n,m;

int tot=1;

int ans;

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

bool bfs(int s,int t)

}l++;

}if(d[s]==-1)

else

}int dfs(int x,int flow)

int now_flow;

int used=0;

for(int &i=head[x];i;i=next[i])}}

if(used==0)

return used;

}int dinic()

return res;

}int main()

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

scanf("%d",&m);

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

printf("%d",ans-dinic());

}

BZOJ3438 小M的作物

bzoj3438 小m的作物 小m在mc裡開闢了兩塊巨大的耕地a和b 你可以認為容量是無窮 現在,小p有n中作物的種子,每種作物的種子有1個 就是可以種一棵作物 用1.n編號 現在,第i種作物種植在a中種植可以獲得ai的收益,在b中種植可以獲得bi的收益,而且,現在還有這麼一種神奇的現象,就是某些作...

bzoj3438 小M的作物

題目鏈結 先考慮沒有額外收益的時候怎麼做。從 s 向第 i 點連一條容量為 a i 邊,表示種在 a 中的收益。從第 i 個點向 t 連一條容量為 b i 的邊,表示種在 b 中的收益。然後求出來最小割,用總收益減去即可。完成之後如下圖 然後考慮如何處理額外收益 對於每乙個額外的收益,我們先新建乙個...

bzoj3438 小M的作物

這題是一道最大權閉合圖的經典難題 by rose max upd 不誤人子弟了,這就是乙個裸的最小割啊。然後構圖的方式就是把作物值分成ab集合,乙個在st一邊,乙個在ed一邊,st連作物流量為a i 作物流ed流量為b i 對於每乙個組合,新建兩個點,乙個被st流流量為c1,乙個流ed流量為c2,然...