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