BZOJ1061 NOI2008 志願者招募

2022-08-11 08:18:09 字數 1361 閱讀 5666

portal

實行乙個\(n(n\leq10^3)\)天的專案,其中第\(i\)天至少需要\(b_i\)個人。一共有\(m(m\leq10^4)\)類志願者可以招募,其中第\(i\)類可以從第\(s_i\)天工作到第\(t_i\)天,招募費用是每人\(c_i\)元。求最小花費的招募方案。

根據題意,很容易列出乙個線性規劃:

\[\begin

min \quad & \sum_^m c_ix_i \\

s.t. \quad & \sum_^m a_x_i \geq b_j \\

& x_i\geq0

\end

$$其中$x_i$代表第$i$類志願者的個數,$a_=1$當且僅當$s_i\leq j \leq t_i$。

該線性規劃可轉化為其對偶問題:

\]\begin

max \quad & \sum_^n b_jy_j \

s.t. \quad & \sum_^n a_y_j \leq c_i \

& y_j\geq0

\end

\[用單純形求解即可。

##solution2

還可以用費用流求解。按如下方式建圖:

- $s=0,t=n+1$,共$n+2$個點;

- 連邊$(s,1)$,容量為足夠大的數$u$,費用為$0$;

- 連邊$(i,i+1)$,容量為$u-b_i$,費用為$0$;

- 對於第$i$類志願者,連邊$(s_i,t_i+1)$,容量為$+\infty$,費用為$c_i$。

第$i$類志願者代表的邊每有$1$的流量,原圖$s_i$到$t_i$就可以少$1$的流量,就相當於招募了乙個志願者。

##code

```cpp

//[noi2008]志願者招募

#include inline char gc()

return *s++;

}inline int read()

return *s++;

}inline int read()

{ int x=0; char ch=gc();

while(ch<'0'||'9'q; bool inq[n];

bool spfa()

{ for(int i=s;i<=t;i++) dst[i]=inf,pre[i]=0;

dst[s]=0; q.push(s),inq[s]=true;

while(!q.empty())

{int u=q.front(); q.pop(),inq[u]=false;

for(int i=h[u];i;i=ed[i].nxt)

{int v=ed[i].v,w=ed[i].w;

if(ed[i].c&&dst[u]+w

bzoj1061 Noi2008 志願者招募

跟上一道基本相同,可以單純形法解線性規劃,也可以費用流.寫費用流的話建圖就是一般的線性規劃轉費用流的套路,加上基變數,然後化成等式,每個下式減上式之後可以化成表示流量平衡的等式,然後根據等式建圖就好了,跑乙個最小費用最大流.寫單純形沒有寫網路流好理解,單純形的話因為這是最小化費用的,首先要轉化成對偶...

BZOJ1061 NOI2008 志願者招募

bzoj 我們設每類志願者分別招募了b i b i 個 那麼,我們可以得到一系列的方程 s i x t i b i a x s i x t i b i a x 一共n n 天,所以是 n role presentation n n個方程 因為有不等式讓我們很不爽,所以換成等式。這裡,設y i y i...

bzoj 1061 Noi2008 志願者招募

題目大意 專案需要n 天才能完成,其中第i 天至少需要ai 個人。布布通過了解得知,一共有m 類志願者可以招募。其中第i 類可以從第si 天工作到第ti 天,招募費用是每人ci 元。新官上任三把火,為了出色地完成自己的工作,布布希望用盡量少的費用招募足夠的志願者 題解 include include...