luogu P4016 负载平衡问题
2018-03-03 17:08
134 查看
关于构图:
首先,这是一道最小费用(费用指在两个相邻仓库中的运输单价)最大流的题目。
1.必不可少的有一个超级源点和汇点,st=0,ed=n+1。
2.贪心的想,为了是所有仓库的数量都相等,就应该讲多余平均值的仓库运往少于平均值的仓库,自然而然就想到多的仓库应该贡献,连向源点;少的仓库应该得到,连向汇点,且费用为0(因为费用指在两个相邻仓库中的运输单价)。
3.另外,相邻的节点之间也要建边,对于两个相邻的节点,我们应该连上一条流量为INF(可以无限运输),费用为1的边,因为是无向图,所以应该建双向边,注意:还要建反向边(不理解)。
4.注意:本题为环,所以1号节点与n号节点还应特殊处理(参照3)。
首先,这是一道最小费用(费用指在两个相邻仓库中的运输单价)最大流的题目。
1.必不可少的有一个超级源点和汇点,st=0,ed=n+1。
2.贪心的想,为了是所有仓库的数量都相等,就应该讲多余平均值的仓库运往少于平均值的仓库,自然而然就想到多的仓库应该贡献,连向源点;少的仓库应该得到,连向汇点,且费用为0(因为费用指在两个相邻仓库中的运输单价)。
3.另外,相邻的节点之间也要建边,对于两个相邻的节点,我们应该连上一条流量为INF(可以无限运输),费用为1的边,因为是无向图,所以应该建双向边,注意:还要建反向边(不理解)。
4.注意:本题为环,所以1号节点与n号节点还应特殊处理(参照3)。
关于代码:
#include<cstdio> #include<queue> #include<cstring> #include<queue> #include<algorithm> #define INF 2147483647 using namespace std; queue<int> f; int n,m,len=0,st,ed; struct node{int x,y,c,d,next;} a[10000]; int b[10000],last[10000],dis[10000],pre[10000],pos[10000],p[10000]; bool bz[10000]; void ins(int x,int y,int c,int d) { a[len].x=x;a[len].y=y;a[len].c=c;a[len].d=d;a[len].next=last[x];last[x]=len++; } bool spfa() { memset(bz,true,sizeof(bz)); bz[st]=false; memset(dis,63,sizeof(dis)); dis[st]=0; p[st]=INF; f.push(st); while(!f.empty()) { int x=f.front(); bz[x]=true; for(int i=last[x];i!=-1;i=a[i].next) { int y=a[i].y; if(a[i].c>0&&dis[y]>dis[x]+a[i].d) { dis[y]=dis[x]+a[i].d; pos[y]=x; pre[y]=i; p[y]=min(p[x],a[i].c); if(bz[y]) { f.push(y); bz[y]=false; } } } f.pop(); } return dis[ed]<1061109567; } int flow() { int ans=0; while(spfa()) { ans+=p[ed]*dis[ed]; for(int i=ed;i!=st;i=pos[i]) { a[pre[i]].c-=p[ed]; a[pre[i]^1].c+=p[ed]; } } return ans; } int main() { int sum=0; scanf("%d",&n); st=0;ed=n+1; for(int i=1;i<=n;i++) { scanf("%d",&b[i]); sum+=b[i]; } sum/=n; memset(last,-1,sizeof(last)); for(int i=1;i<=n;i++) if(b[i]>sum) ins(st,i,b[i]-sum,0),ins(i,st,0,0); else ins(i,ed,sum-b[i],0),ins(ed,i,0,0); for(int i=2;i<=n;i++) { ins(i-1,i,INF,1),ins(i,i-1,0,-1); ins(i,i-1,INF,1),ins(i-1,i,0,-1); } ins(1,n,INF,1),ins(n,1,0,-1); ins(n,1,INF,1),ins(1,n,0,-1); printf("%d",flow()); }
相关文章推荐
- [codevs 1916] 负载平衡问题
- 线性规划与网络流24——负载平衡问题
- 1954【线性规划与网络流24题 19】负载平衡问题
- [codevs 1916] 负载平衡问题
- [codeVS1916] 负载平衡问题(最小费用流,拆点)
- 网络流24题 19负载平衡问题
- 洛谷 P4016 负载平衡问题 【最小费用最大流】
- 网络流24题 19负载平衡问题
- 网络流二十四题之十九 —— 负载平衡问题
- 负载平衡配置过程需要注意的问题
- 负载平衡问题[网络流24题之19]
- 洛谷P4016:负载平衡问题
- 【codevs1916】[网络流24题]负载平衡问题
- 网络流24题之负载平衡问题
- 【codevs1916】负载平衡问题 费用流
- 负载平衡问题(网络流)
- 负载平衡问题
- [网络流24题][CODEVS1916]负载平衡问题(费用流)
- [网络流24题]负载平衡问题
- 【网络流24题】负载平衡问题