time limit: 10 sec
memory limit: 256 mb
submit: 1078
solved: 468 [
submit][
status][
discuss]
小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。
kpmcup#0 by greens [
submit][
status][
discuss]
考慮最大收益 = 總收益 - 最小割,將此題轉換成最小割模型
這是一種多元限制關係,對於每種作物i,從s向i連容量為ai的邊,i向t連容量為bi的邊
若作物i最後在s割,說明種在a地,否則在b地,考慮限制關係
對於第i個限制關係,拆成兩個點ui,vi,從s向ui連容量為c1i的邊,ui向集合內每個點連容量為inf的邊
同理,vi向t連容量為c2i的邊,集合內每個點向vi連容量為inf的邊,此圖最大流就是最小割了
證明:容量inf的邊保證限制點要麼和所有作物在同乙個割集,要麼支付這個代價
#include#include#include#include#includeusing namespace std;
const int maxn = 3030;
const int maxm = 4e6;
const int inf = ~0u>>1;
struct e
e(int to,int cap,int flow): to(to),cap(cap),flow(flow){}
}edgs[maxm];
int n,m,s,t,cnt,ans,tot,a[maxn],b[maxn],l[maxn],cur[maxn];
vector v[maxn];
queue q;
void add(int x,int y,int cap)
bool bfs()
}return l[t];}
int dinic(int x,int a)
if (!flow) l[x] = -1; return flow;}
int getint()
int main()
for (int i = 1; i <= n; i++) add(s,i,a[i]),add(i,t,b[i]);
int maxflow = 0;
while (bfs())
cout << ans - maxflow << endl;
return 0;
}
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,然...