1221 HNOI2001 軟體開發

2021-07-08 18:52:59 字數 1165 閱讀 1066

最小費用最大流。

建圖:拆點,每個點拆成入點和出點。

顯然,要滿足每天的餐巾**,於是有附加源匯st,s向入點引一條容量為ni,費用為0的邊,出點向t引一條容量為ni,費用為0的邊。

若滿足題目要求,這必有所有出點到t的弧滿載,為了保證這一點,由s向出點引容量為無窮,費用為f的邊。

又因為每天沒用完的餐巾可以留到下一天,所以每天的入點向下一天的入點引流量為無窮,費用為0的邊。

又由題目的條件,對於餐巾消毒,第i天的入點向第i+a(b)天的出點引一條容量為無窮,費用為fa(fb)的邊。

求st得最小費用最大流即得答案。

#include#include#include#includeusing namespace std;

const int inf=1e9;

struct edgee[50005];

int head[2005],d[2005],from[2005],cnt=1;

bool inq[2005];

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

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

bool spfa(int s,int t,int &cost)

} }if(d[t]>=inf)return false;

int x=inf;

for(int i=from[t];i;i=from[e[i].from])x=min(x,e[i].v);

for(int i=from[t];i;i=from[e[i].from])

return true;

}int mcmf(int s,int t)

int main(){

int n,a,b,f,fa,fb;

scanf("%d%d%d%d%d%d",&n,&a,&b,&f,&fa,&fb);

int s=2*n+1,t=s+1;

for(int i=1;i<=n;i++){

int w;scanf("%d",&w);

insert(s,i,w,0);

insert(i+n,t,w,0);

if(i+a+1<=n)insert(i,i+a+n+1,inf,fa);

if(i+b+1<=n)insert(i,i+b+n+1,inf,fb);

if(i

BZOJ1221 HNOI2001 軟體開發

某軟體公司正在規劃一項n天的軟體開發計畫,根據開發計畫第i天需要ni個軟體開發人員,為了提高軟體開發人員的效率,公司給軟體人員提供了很多的服務,其中一項服務就是要為每個開發人員每天提供一塊消毒毛巾,這種消毒毛巾使用一天後必須再做消毒處理後才能使用。消毒方式有兩種,a種方式的消毒需要a天時間,b種方式...

bzoj1221 HNOI2001 軟體開發

time limit 10 sec memory limit 162 mb submit 1351 solved 748 submit status discuss 某軟體公司正在規劃一項n天的軟體開發計畫,根據開發計畫第i天需要ni個軟體開發人員,為了提高軟體開發人員的效率,公司給軟體人員提供了很...

HNOI2001 產品加工

題目描述 某加工廠有a b兩台機器,來加工的產品可以由其中任何一台機器完成,或者兩台機器共同完成。由於受到機器效能和產品特性的限制,不同的機器加工同一產品所需的時間會不同,若同時由兩台機器共同進行加工,所完成任務又會不同。某一天,加工廠接到n個產品加工的任務,每個任務的工作量不盡一樣。你的任務就是 ...