NOI2008 BZOJ1061志願者招募

2021-07-10 11:01:48 字數 3729 閱讀 2099

1061: [noi2008]志願者招募

time limit: 20 sec memory limit: 162 mb

submit: 3028 solved: 1872

description

申奧成功後,布布經過不懈努力,終於成為奧組委下屬公司人力資源部門的主管。布布剛上任就遇到了乙個難題:為即將啟動的奧運新專案招募一批短期志願者。經過估算,這個專案需要n 天才能完成,其中第i 天至少需要ai 個人。 布布通過了解得知,一共有m 類志願者可以招募。其中第i 類可以從第si 天工作到第ti 天,招募費用是每人ci 元。新官上任三把火,為了出色地完成自己的工作,布布希望用盡量少的費用招募足夠的志願者,但這並不是他的特長!於是布布找到了你,希望你幫他設計一種最優的招募方案。

input

第一行包含兩個整數n, m,表示完成專案的天數和可以招募的志願者的種類。 接下來的一行中包含n 個非負整數,表示每天至少需要的志願者人數。 接下來的m 行中每行包含三個整數si, ti, ci,含義如上文所述。為了方便起見,我們可以認為每類志願者的數量都是無限多的。

output

僅包含乙個整數,表示你所設計的最優方案的總費用。

sample input

3 3

2 3 4

1 2 2

2 3 5

3 3 2

sample output

14 hint

招募第一類志願者3名,第三類志願者4名 30%的資料中,1 ≤ n, m ≤ 10,1 ≤ ai ≤ 10; 100%的資料中,1 ≤ n ≤ 1000,1 ≤ m ≤ 10000,題目中其他所涉及的資料均 不超過2^31-1。

這道題正確的解法是構造網路,求網路最小費用最大流,但是模型隱藏得較深,不易想到。構造網路是該題的關鍵,以下面乙個例子說明構圖的方法和解釋。

例如一共需要4天,四天需要的人數依次是4,2,5,3。有5類志願者,如下表所示:

種類 1 2 3 4 5

時間 1-2 1-1 2-3 3-3 3-4

費用 3 4 3 5 6

設僱傭第i類志願者的人數為x[i],每個志願者的費用為v[i],第j天僱傭的人數為p[j],則每天的僱傭人數應滿足乙個不等式,如上表所述,可以列出

p[1] = x[1] + x[2] >= 4

p[2] = x[1] + x[3] >= 2

p[3] = x[3] + x[4] +x[5] >= 5

p[4] = x[5] >= 3

對於第i個不等式,新增輔助變數y[i] (y[i]>=0) ,可以使其變為等式

p[1] = x[1] + x[2] - y[1] = 4

p[2] = x[1] + x[3] - y[2] = 2

p[3] = x[3] + x[4] +x[5] - y[3] = 5

p[4] = x[5] - y[4] = 3

在上述四個等式上下新增p[0]=0,p[5]=0,每次用下邊的式子減去上邊的式子,得出

① p[1] - p[0] = x[1] + x[2] - y[1] = 4

② p[2] - p[1] = x[3] - x[2] -y[2] +y[1] = -2

③ p[3] - p[2] = x[4] + x[5] - x[1] - y[3] + y[2] =3

④ p[4] - p[3] = - x[3] - x[4] + y[3] - y[4] = -2

⑤ p[5] - p[4] = - x[5] + y[4] = -3

觀察發現,每個變數都在兩個式子中出現了,而且一次為正,一次為負。所有等式右邊和為0。接下來,根據上面五個等式構圖。

每個等式為圖中乙個頂點,新增源點s和匯點t。

如果乙個等式右邊為非負整數c,從源點s向該等式對應的頂點連線一條容量為c,權值為0的有向邊;如果乙個等式右邊為負整數c,從該等式對應的頂點向匯點t連線一條容量為c,權值為0的有向邊。

如果乙個變數x[i]在第j個等式中出現為x[i],在第k個等式中出現為-x[i],從頂點j向頂點k連線一條容量為∞,權值為v[i]的有向邊。

如果乙個變數y[i]在第j個等式中出現為y[i],在第k個等式中出現為-y[i],從頂點j向頂點k連線一條容量為∞,權值為0的有向邊。

構圖以後,求從源點s到匯點t的最小費用最大流,費用值就是結果。

根據上面的例子可以構造出如下網路,紅色的邊為每個變數x代表的邊,藍色的邊為每個變數y代表的邊,邊的容量和權值標已經標出(藍色沒有標記,因為都是容量∞,權值0)。

在這個圖中求最小費用最大流,流量網路如下圖,每個紅色邊的流量就是對應的變數x的值。

所以,答案為43+23+3*6=36。

上面的方法很神奇得求出了結果,思考為什麼這樣構圖。我們將最後的五個等式進一步變形,得出以下結果

① - x[1] - x[2] + y[1] + 4 = 0

② - x[3] + x[2] + y[2] - y[1] - 2 = 0

③ - x[4] - x[5] + x[1] + y[3] - y[2] + 3 = 0

④ x[3] + x[4] - y[3] + y[4] - 2 = 0

⑤ x[5] - y[4] - 3 = 0

可以發現,每個等式左邊都是幾個變數和乙個常數相加減,右邊都為0,恰好就像網路流中除了源點和匯點的頂點都滿足流量平衡。每個正的變數相當於流入該頂點的流量,負的變數相當於流出該頂點的流量,而正常數可以看作來自附加源點的流量,負的常數是流向附加匯點的流量。因此可以據此構造網路,求出從附加源到附加匯的網路最大流,即可滿足所有等式。而我們還要求noi_employee_3最小,所以要在x變數相對應的邊上加上權值,然後求最小費用最大流。

由於建圖太神,只能%rush出正解的神犇。。

當時知道費用流也不會建圖,等學完線性規劃update此篇博文。。

附上本蒟蒻的**:

#include

#include

#include

using namespace std;

#define t 1002

#define inf 0x7fffffff

int n,m,cnt=1,head,tail,dis[10001],h[10001],q[10001],ans=0,sum;

bool mark[10001],vis[10001];

struct kx

edge[50001];

intread()

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

w=w*10+ch-'0',ch=getchar();

return w*s;

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

bool spfa()}}

return dis[0]!=inf;

}int dfs(int

x,int f)

return used;

}int main()

add(n+1,t,l,0);

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

while (spfa())

}printf("%d",ans);

return

0;}

NOI2008 BZOJ1061 志願者招募

description 申奧成功後,布布經過不懈努力,終於成為奧組委下屬公司人力資源部門的主管。布布剛上任就遇到了乙個難題 為即將啟動的奧運新專案招募一批短期志願者。經過估算,這個專案需要n 天才能完成,其中第i 天至少需要ai 個人。布布通過了解得知,一共有m 類志願者可以招募。其中第i 類可以從...

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...