最小費用最大流。
建圖:拆點,每個點拆成入點和出點。
顯然,要滿足每天的餐巾**,於是有附加源匯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個產品加工的任務,每個任務的工作量不盡一樣。你的任務就是 ...