題目描述
小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 那麼此時有合種的貢獻,我們不妨先加到初始值,再考...