費用流 NOI2008志願者招募

2022-05-03 16:09:19 字數 1874 閱讀 3081

time limit: 20 sec  memory limit: 162 mb

submit: 5171  solved: 3089

[submit][status][discuss]

申奧成功後,布布經過不懈努力,終於成為奧組委下屬公司人力資源部門的主管。布布剛上任就遇到了乙個難

題:為即將啟動的奧運新專案招募一批短期志願者。經過估算,這個專案需要n 天才能完成,其中第i 天至少需要

ai 個人。 布布通過了解得知,一共有m 類志願者可以招募。其中第i 類可以從第si 天工作到第ti 天,招募費用

是每人ci 元。新官上任三把火,為了出色地完成自己的工作,布布希望用盡量少的費用招募足夠的志願者,但這

並不是他的特長!於是布布找到了你,希望你幫他設計一種最優的招募方案。

第一行包含兩個整數n, m,表示完成專案的天數和可以招募的志願者的種類。 接下來的一行中包含n 個非負

整數,表示每天至少需要的志願者人數。 接下來的m 行中每行包含三個整數si, ti, ci,含義如上文所述。為了

方便起見,我們可以認為每類志願者的數量都是無限多的。

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

3 32 3 4

1 2 2

2 3 5

3 3 2

141 ≤ n ≤ 1000,1 ≤ m ≤ 10000,題目中其他所涉及的資料均 不超過2^31-1。

試題分析:這題並不需要線性規劃。。。

最小可行費用流是可做的,而且簡單的多:

我們先考慮每天的限制,每天開乙個點,點限制[ai,inf]。

然後將每一天之間連單向邊(向下一天),費用0,邊限制[0,inf]

最後對於每個三元組(s,t,c)只需將t向s連一條費用為c,邊限制[0,inf]的邊。

關於怎麼限制點,只需要拆點(1個變為2個)然後將入邊連都接到乙個點上,將出邊連線到另外乙個點上,在這兩個點之間建一條與點限制相同點邊。

然後求一遍無源匯最小可行性費用流即可。

**:

#include#include#include#include#include#includeusing namespace std;

#define ll long long

inline int read()

const int inf=9999999;

const int maxn=300000*3;

int n,m;

int s,t;

int root[maxn+1],node[maxn+1],next[maxn+1],cost[maxn+1],c[maxn+1];

int dis[maxn+1]; bool inq[maxn+1];

int cnt;

void insert(int u,int v,int w,int c)

bool bfs()

}} inq[k]=false;

} return dis[s]-1;x=next[x])

} return res;

}int main()

for(int i=1;iinsert(i+n,i+1,inf,0),insert(i+1,i+n,0,0);

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

n=n*2+2;

--cnt;

while(bfs())

printf("%d\n",ans);

return 0;

}

NOI 2008 志願者招募(費用流)

題目描述 一共有n天,每天需要a i 個人,一共有m類志願者,每類有無限個,可以從s i 服務到t i 需要花費c i 的費用。問要滿足要求,最小的費用。題目分析 這題有乙個經典的也很奇妙的構圖法 利用不等式構圖 這個我不懂,想看的話請到byvoid神牛的blog裡面搜 我的想法很樸素,流的話就表示...

NOI2008 志願者招募(費用流)

很裸的費用流。建圖也很顯然。從源點向第一天連容量為inf infin f的邊,從第n 1 n 1n 1天向匯點連inf infin f的邊。然後從第i ii天向第i 1 i 1i 1天連容量為inf a i inf a i inf a i 的邊。現在的問題就是,我們需要花一定的代價對流量進行補償,對...

NOI2008 志願者招募 (費用流)

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