luogu P1361 小M的作物 網路流

2022-03-09 16:48:17 字數 1207 閱讀 4837

題目描述

小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個整數,表示該組合中的作物編號。

輸出格式

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

#include#include#include#includeusing namespace std;

inline int read()

while(ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar();

return s * w;

}const int n=500005,m=10*n,inf=1<<30;

int nxt[m],head[n],go[m],edge[m],tot=1;

inline void add(int u,int v,int w)

int n,m,s,t,maxflow=0;

int d[n];

inline bool bfs()

} }return 0;

}int dinic(int u,int flow)

} return flow-rest;

}signed main()

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

m=read();

for(int i=1,x,y,c1,c2;i<=m;i++) }

int flow=0;

while(bfs())

while(flow=dinic(s,inf))maxflow+=flow;

cout<}

P1361 小M的作物

p1361 小m的作物 二者取其一型別的網路流題 不同的集合,向對應元素連去不同 收益 容量的邊 對於那些神奇的組合,我們只需要按照以下方式建立兩個點 x 向 s 連一條在a時的額外收益 2.x x 注意順序,x 是其有向邊的起點,x 是其有向邊的終點 向其後繼節點連 inf 容量的邊,保證不會出現...

P1361 小M的作物

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

LG P1361 小M的作物

點這裡看題目。經典的一類最小割問題。首先不難確定問題的方向是最小割,以下我們認為 u in s 表示種在 a 田,u in t 表示種在 b 田。考慮如果沒有合種的額外貢獻,我們可以對於每個點,連線 s overset u 和 u overset t 那麼此時有合種的貢獻,我們不妨先加到初始值,再考...