申奧成功後,布布經過不懈努力,終於成為奧組委下屬公司人力資源部門的主管。布布剛上任就遇到了乙個難
題:為即將啟動的奧運新專案招募一批短期志願者。經過估算,這個專案需要n 天才能完成,其中第i 天至少需要
ai 個人。 布布通過了解得知,一共有m 類志願者可以招募。其中第i 類可以從第si 天工作到第ti 天,招募費用
是每人ci 元。新官上任三把火,為了出色地完成自己的工作,布布希望用盡量少的費用招募足夠的志願者,但這
並不是他的特長!於是布布找到了你,希望你幫他設計一種最優的招募方案。
思路1:最小費用流
設第i類人招募了xi個,aij表示第i個人第j天是否工作,工作為1,不工作為0,則應滿足對於所有j,∑in
aijx
i>=a
j\sum_i^na_x_i >= a_j
∑inai
jxi
>=a
j,需要最小化z=∑
1nci
xi
z=\sum_1^nc_ix_i
z=∑1n
cix
i,對於第j天的不等式∑in
aijx
i>=a
j\sum_i^na_x_i >= a_j
∑inai
jxi
>=a
j在左側減去乙個p[j]得到∑in
aijx
i−p[
j]=a
j\sum_i^na_x_i -p[j]= a_j
∑inai
jxi
−p[
j]=a
j,對於將任意兩個相鄰的等式相減可以得到n+1個等式,並且x
ix_i
xi將在第l[i]個等式處取正,在r[i]+1號等式處取負,p[j]將在第j+1個等式處取正,在第j個等式處取負,故對於第i個人,連一條(l[i],r[i],inf,c[i])的邊,對於相鄰的兩個等式連一條(i-1,i,inf,0)的邊,最後根據aj−
aj−1
a_j-a_
aj−aj
−1的正負來決定源點和匯點的邊,然後跑最小費用最大流即可
#include
#include
#include
#include
#include
#define maxn 10010
#define maxm 40010
using
namespace std;
const
int inf =
0x3f3f3f3f
;int tot,head[maxn]
,cnt;
struct edge
edg[maxm<<1]
;inline
void
addedg
(int u,
int v,
int c,
int w)
inline
void
add(
int u,
int v,
int c,
int w)
int vis[maxn]
,d[maxn]
,pre[maxn]
,path[maxn]
,cost;
//d用來存最短路,pre用來存路徑,path用來存用了哪條邊,cost用來儲存最小費用
inline
bool
spfa
(int st,
int ed)}}
}return pre[ed]!=-
1;}inline
intmincostmaxflow
(int st,
int ed)
// if(d[ed] >= 0) //保證費用最小,去掉後保證流量最大
// break;
flow +
= minn;
cost +
= minn * d[ed];}
return flow;
}inline
void
init()
struct node
nod[maxn]
;int n,m,a[maxn]
;int
main()
a[0]
= a[n+1]
=0;for
(int i =
1;i <= n+1;
++i)
mincostmaxflow
(s,t)
;printf
("%d\n"
,cost);}
return0;
}
思路2:單純形 bzoj1061 線性規劃
線性規劃裸題。根據題目很容易可以得到線性規劃方程 以樣例為例 min 2 x1 5 x2 2 x3 x1 0 0 2 x1 x2 0 3 0 x2 x3 4 x1,x2,x3 0 再將方程對偶,得到 max 2 x1 3 x2 4 x3 x1 x2 0 2 0 x2 x3 5 0 0 x3 2 x1...
HYSBZ 1061,單純形 對偶原理
申奧成功後,布布經過不懈努力,終於成為奧組委下屬公司人力資源部門的主管。布布剛上任就遇到了乙個難 題 為即將啟動的奧運新專案招募一批短期志願者。經過估算,這個專案需要n 天才能完成,其中第i 天至少需要 ai 個人。布布通過了解得知,一共有m 類志願者可以招募。其中第i 類可以從第si 天工作到第t...
單純形求解線性規劃 BZOJ1061
推薦一篇 我們設xi為第i個志願者的招募次數,以樣例為例,則不難列出如下的線性規劃方程 minx1 0 0 2 x1 x2 0 3 0 x2 x3 4 那麼,根據 這個方程等價於 maxx1 x2 0 2 0 x2 x3 5 0 0 x3 2 我們發現,這是乙個線性規劃方程的基本形式,基本解為 然後...