題目戳我
\(\text\)
這題要求最大收穫,可以轉化為所有可能的收益減去最小割。
單個點很好連邊 \((s\to pos\to t),\) 問題在於如何處理組合的點。
觀察到,乙個組合要不然全部都劃分到某乙個集合,要不然不做貢獻。注意到組合裡面的點是不能拆開的。
所以我們建立乙個組合虛點,它連線所有組合內的點,邊權是 \(\infty.\) 這樣就一定可以避免把它們劃分到不同集合中。
那麼,我們可以考慮如下建模模型:
\(\text\to \text \to \text \to \text \to \text.\)
本題我們可以把 \(a\) 看作 \(s,t\) 同理。
於是這個題再套上我們最熟悉的\(\text\)模板就過了。
最後來分析一下這個圖的規模:
首先,所有點都應該有乙個對應點,再加上每乙個集合的開始點和結束點,共\(n+m+m\)個。最大是\(3000.\)
對於邊:每個點對源點和匯點都會連邊,這裡是\(n+n.\)每乙個組合,其邊數是組合中的點數的兩倍,共約為\(n+n+2mk.\)最大資料是\(2*10^6+2000.\)
根據\(dinic\)的複雜度\(o(n^2 m)\)這個數量級顯然會炸,但是出題人畢竟一定會讓\(dinic\)過,以及\(dinic\)複雜度跑不滿的原因,這個演算法是可以過的。
#includeusing namespace std;
const int inf=(1<<30);
const int maxn=2e6+10;
int tot=1,head[maxn];
int dep[maxn],cur[maxn];
int n,a[maxn],b[maxn],m;
int ans,c1[maxn],c2[maxn],s,t;
vectorv[maxn];
struct ee[maxn];
inline void add(int x,int y,int w)
bool bfs(int s,int t)
} }
return false;
}int dfs(int s,int flow,int t)
} return flow-rest;
}int dinic(int s,int t)
void deal()
}int main()
} deal();
printf("%d\n",ans-dinic(s,t));
return 0;
}
3438 小M的作物
time limit 10 sec memory limit 256 mb submit 1078 solved 468 submit status discuss 小m在mc裡開闢了兩塊巨大的耕地a和b 你可以認為容量是無窮 現在,小p有n中作物的種子,每種作物的種子 有1個 就是可以種一棵作物 ...
1752 小M 的作物 crop
題目描述 小m 還是個特麼喜歡玩mc 的孩紙。小m 在mc 裡開闢了兩塊巨大的耕地a和b 你可以認為容量是無窮 現在,小p有nn中作物的種子,每種作物的種子有11個 就是可以種一棵作物 用1 n 1 n 編號 現在,第 ii 種作物種植在a中種植可以獲得 a iai 的收益,在b 中種植可以獲得 b...
題解 洛谷P1361 小M的作物
有兩塊容量為無限大的耕地a,b。對於每一種種子,種在a裡的收益為ai,種在b裡的收益為bi。特別地,對於m種組合,如果組合中的種子全部種在a裡,可以獲得c1的額外收益,全部種在b裡則可以獲得c2的額外收益。求最大的收益。我們考慮對於一種種子要不在a地,要不在b地。當我們取其中一種情況時,就要把另一種...