bzoj3438 小M的作物

2022-04-10 04:56:57 字數 1462 閱讀 9394

題目鏈結

先考慮沒有額外收益的時候怎麼做。

從\(s\)向第\(i\)點連一條容量為\(a_i\)邊,表示種在\(a\)中的收益。

從第\(i\)個點向\(t\)連一條容量為\(b_i\)的邊,表示種在\(b\)中的收益。

然後求出來最小割,用總收益減去即可。

完成之後如下圖:

然後考慮如何處理額外收益

對於每乙個額外的收益,我們先新建乙個點\(x\),表示全部建在\(a\)的收益。

需要保證如果不割掉這條邊,那麼就說明這些點全部建在\(a\).所以這些點向\(t\)的連邊必須全部割掉。

那麼就從\(s\)向\(x\)連邊,從\(x\)向該組合中所有點連邊。

對於全部建在b處的額外收益,同理。

加入上圖中含有組合\(\\),建圖之後如下:

然後用總收益減去最小割就是答案。

/*

* @author: wxyww

* @date: 2019-06-10 08:33:40

* @last modified time: 2019-06-10 09:10:44

*/#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int n = 10100,m = 5000100,inf = 2e9;

ll read()

while(c>='0'&&c<='9')

return x*f;

}struct node e[m];

queueq;

int dep[n],head[n],ejs = 1;

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

int s,t,cur[n];

bool bfs()

} }return false;

}int dfs(int u,int now)

} return ret;

}int dinic()

return ret;

}int ans = 0;

int main()

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

int m = read();

int cnt = n + 2;

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

} cout<

return 0;

}

BZOJ3438 小M的作物

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

bzoj3438 小M的作物

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

BZOJ3438 小M的作物

time limit 10 sec memory limit 256 mb submit 247 solved 124 submit status 背景小m還是個特麼喜歡玩mc的孩紙。描述小m在mc裡開闢了兩塊巨大的耕地a和b 你可以認為容量是無窮 現在,小p有n中作物的種子,每種作物的種子有1個 ...