[网络流24题][CODEVS1916]负载平衡问题(费用流)
来源:互联网 发布:英雄联盟网络剧 编辑:程序博客网 时间:2024/05/22 03:10
题目描述
传送门
题解
首先拆点,分XiYi,对应每个仓库。
从源点向Xi连边,容量为ri,费用为0;
从Yi向汇点连边,容量为xba,费用为0;
从Xi向对应的Yi连边,容量为INF,费用为0;
从Yi向环形相邻的Xi连边,容量为INF,费用为1;
用费用流求解即可。图中不会出现环。
刚开始的思路有问题。只是把Xi向相邻的Yi连边了。由于货物在仓库之间可以被运输多次,这样的建图方法是不科学的。
代码
#include<iostream>#include<cstring>#include<cstdio>#include<queue>using namespace std;const int max_n=105;const int max_N=max_n*2+2;const int max_m=max_n*10;const int max_e=max_m*2;const int INF=1e9;int n,N,sum,xba,ans,maxflow,mincost;int a[max_n],near[max_n];int tot,point[max_N],next[max_e],v[max_e],remain[max_e],c[max_e];int dis[max_N],last[max_N];bool vis[max_N];queue <int> q;inline void addedge(int x,int y,int cap,int z){ ++tot; next[tot]=point[x]; point[x]=tot; v[tot]=y; remain[tot]=cap; c[tot]=z; ++tot; next[tot]=point[y]; point[y]=tot; v[tot]=x; remain[tot]=0; c[tot]=-z;}inline int addflow(int s,int t){ int ans=INF,now=t; while (now!=s){ ans=min(ans,remain[last[now]]); now=v[last[now]^1]; } now=t; while (now!=s){ remain[last[now]]-=ans; remain[last[now]^1]+=ans; now=v[last[now]^1]; } return ans;}inline bool bfs(int s,int t){ memset(dis,0x7f,sizeof(dis)); dis[s]=0; memset(vis,0,sizeof(vis)); vis[s]=true; while (!q.empty()) q.pop(); q.push(s); while (!q.empty()){ int now=q.front(); q.pop(); vis[now]=false; for (int i=point[now];i!=-1;i=next[i]) if (dis[v[i]]>dis[now]+c[i]&&remain[i]){ dis[v[i]]=dis[now]+c[i]; last[v[i]]=i; if (!vis[v[i]]){ vis[v[i]]=true; q.push(v[i]); } } } if (dis[t]>INF) return false; int flow=addflow(s,t); mincost+=flow*dis[t]; return true;}inline void major(int s,int t){ mincost=0; while (bfs(s,t));}int main(){ tot=-1; memset(point,-1,sizeof(point)); memset(next,-1,sizeof(next)); scanf("%d",&n); N=n*2+2; for (int i=1;i<=n;++i) scanf("%d",&a[i]),sum+=a[i]; xba=sum/n; for (int i=1;i<=n;++i) near[i]=i; near[0]=n; near[n+1]=1; for (int i=1;i<=n;++i){ addedge(1+n+i,1+near[i-1],INF,1); addedge(1+n+i,1+near[i+1],INF,1); addedge(1+i,1+n+i,INF,0); } for (int i=1;i<=n;++i){ addedge(1,1+i,a[i],0); addedge(1+n+i,N,xba,0); } major(1,N); printf("%d\n",mincost);}
总结
①写spfa不要忘记出队。
0 0
- [CODEVS1916]负载平衡问题(费用流)
- [网络流24题][CODEVS1916]负载平衡问题(费用流)
- 【codevs1916】负载平衡问题 费用流
- 【codevs1916】[网络流24题]负载平衡问题
- 线性规划与网络流24题の19 负载平衡问题(最小费用最大流)
- 网络流24题 负载平衡 费用流
- 负载平衡问题(最小费用流)
- 线性规划于网络流24题之负载平衡问题 最小费用最大流
- 【网络流24题】负载平衡问题
- [网络流24题]负载平衡问题
- [网络流24题] 19 负载平衡(最小代价供求,最小费用最大流)
- loj6013「网络流 24 题」负载平衡(费用流)
- 741. [网络流24题] 负载平衡 最小费用最大流/简单
- 负载平衡问题(网络流)
- 网络流24题 19负载平衡问题
- [网络流24题]code vs 1916 负载平衡问题
- 负载平衡问题[网络流24题之19]
- 线性规划与网络流24题 ---19 负载平衡问题
- 错误1error LNK2019: 无法解析的外部符号 _wWinMain@16,该符号在函数 ___tmainCRTStartup 中被引用E:\elipse demo\LTG\LTG\
- 设计模式(五)桥接模式Bridge == Pointer To Implementation
- C++经典面试题
- 使用轨迹球来实现视图的旋转
- ViewPager 详解(四)----自主实现滑动指示条
- [网络流24题][CODEVS1916]负载平衡问题(费用流)
- Java 加载图片
- 数据库MySQL基础——增删查改
- 常用DOS命令
- ViewPager 详解(五)-----使用Fragment实现ViewPager滑动
- 关系数据库规范化理论
- poj 2342 Anniversary party(树形DP基础题)(树形dp模板)
- oracle 新建用户及授予权限
- 实现伸缩二级菜单