网络流(费用流):[网络流24题] 餐巾
2016-07-02 18:07
501 查看
[网络流24题] 餐巾
【问题描述】一个餐厅在相继的N天里,第i天需要Ri块餐巾(i=l,2,…,N)。餐厅可以从三种途径获得餐巾。
(1)购买新的餐巾,每块需p分;
(2)把用过的餐巾送到快洗部,洗一块需m天,费用需f分(f<p)。如m=l时,第一天送到快洗部的餐巾第二天就可以使用了,送慢洗的情况也如此。
(3)把餐巾送到慢洗部,洗一块需n天(n>m),费用需s分(s<f)。
在每天结束时,餐厅必须决定多少块用过的餐巾送到快洗部,多少块送慢洗部。在每天开始时,餐厅必须决定是否购买新餐巾及多少,使洗好的和新购的餐巾之和满足当天的需求量Ri,并使N天总的费用最小。
【输入】
输入文件共 3 行,第 1 行为总天数;第 2 行为每天所需的餐巾块数;第 3 行为每块餐巾的新购费用 p ,快洗所需天数 m ,快洗所需费用 f ,慢洗所需天数 n ,慢洗所需费用 s 。
【输出】
一行,最小的费用
【样例】
napkin.in
3
3 2 4
10 1 6 2 3
napkin.out
64
【数据规模】
n<=200,Ri<=50
这道题建模很巧妙。
只要表示出两类决策就可以了。
#include <iostream> #include <cstring> #include <cstdio> #include <queue> using namespace std; const int maxn=510; const int maxm=8010; const int INF=100000000; int cnt=1,fir[maxn],nxt[maxm]; int to[maxm],cap[maxm],val[maxm]; void addedge(int a,int b,int c,int v){ nxt[++cnt]=fir[a];to[cnt]=b; cap[cnt]=c;val[cnt]=v;fir[a]=cnt; } queue<int>q; int path[maxn]; int dis[maxn],vis[maxn]; int Spfa(int S,int T){ for(int i=S+1;i<=T;i++) dis[i]=INF; q.push(S);vis[S]=1; while(!q.empty()){ int x=q.front(); q.pop();vis[x]=0; for(int i=fir[x];i;i=nxt[i]) if(cap[i]&&dis[to[i]]>dis[x]+val[i]){ dis[to[i]]=dis[x]+val[i]; if(!vis[to[i]])q.push(to[i]); vis[to[i]]=1;path[to[i]]=i; } } return dis[T]==INF?0:dis[T]; } int Aug(int S,int T){ int f=INF,p=T; while(p!=S){ f=min(f,cap[path[p]]); p=to[path[p]^1]; } p=T; while(p!=S){ cap[path[p]]-=f; cap[path[p]^1]+=f; p=to[path[p]^1]; } return f; } int MCMF(int S,int T){ int ret=0,d; while(d=Spfa(S,T)) ret+=Aug(S,T)*d; return ret; } int need[maxn],S,T; int n,b,f,fc,s,sc; int main(){ freopen("napkin.in","r",stdin); freopen("napkin.out","w",stdout); scanf("%d",&n);S=0;T=n*2+1; for(int i=1;i<=n;i++) scanf("%d",&need[i]); scanf("%d%d%d%d%d",&b,&f,&fc,&s,&sc); for(int i=1;i<=n;i++){ addedge(S,i,need[i],0); addedge(i,S,0,0); addedge(S,i+n,INF,b); addedge(i+n,S,0,-b); addedge(i+n,T,need[i],0); addedge(T,i+n,0,0); if(i+f<=n){ addedge(i,i+f+n,INF,fc); addedge(i+f+n,i,0,-fc); } if(i+s<=n){ addedge(i,i+s+n,INF,sc); addedge(i+s+n,i,0,-sc); } if(i!=n){ addedge(i,i+1,INF,0); addedge(i+1,i,0,0); } } printf("%d\n",MCMF(S,T)); return 0; }
相关文章推荐
- 使用开源框架smart image view实现网络资源照片设置到ImageView控件
- Volley源码解析(二)
- 错误:javax.servlet.http.HttpServlet" was not found on the Java Build Path
- java 解析http user-agent 信息
- 使用 Apache HttpClient
- Retrofit2.0 或OKHttp 日志log
- Java 调用 Azure HTTPS API 证书问题
- monitorix(linux)系统和网络监控公工具
- TCP的超时与重传
- RHCA442学习笔记-Unit13网络性能调整
- 计算机网络--网络层
- 【GOF23设计模式】_观察者模式_广播机制_消息订阅_网络游戏对战原理_自带类与接口JAVA251-252
- HttpServletResponse类
- 【android tools】内存、网络、界面性能响应优化的工具
- HTTP与HTTPS对访问速度(性能)的影响
- 使用C#开发HTTP服务器系列之更简单的实现方式
- http://my.oschina.net/u/1177694/blog/491834
- 洛谷P1038 神经网络==codevs1088 神经网络
- springbootboot-HttpServletRequest.getInputStream() 获取post内容
- TCP /IP 协议-IP网际协议