1. 程式人生 > >網絡流24題之負載平衡問題

網絡流24題之負載平衡問題

size %d spf oid log col bool include ace

其實是水題只不過在noip前一個月時我問整個機房也沒人能回答上來。

現在可以隨隨便便切過去了也是很爽的。

最小費用最大流,按題目要求建圖即可。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=250005,inf=1e9;
 4 int d[N],head[N],cnt=-1,n,m,w[105][105],cost,f[N],a[N],b[N],s,t;
 5 bool v[N];
 6 struct node{
 7     int w,to,nex,c,f;
 8 }e[1000005];
9 void add(int x,int y,int w,int c) 10 { 11 e[++cnt].to=y;e[cnt].nex=head[x];head[x]=cnt;e[cnt].f=x;e[cnt].w=w;e[cnt].c=c; 12 e[++cnt].to=x;e[cnt].nex=head[y];head[y]=cnt;e[cnt].f=y;e[cnt].w=0;e[cnt].c=-c; 13 } 14 queue<int>q; 15 bool spfa() 16 { 17 memset(d,0x3f,sizeof(d));
18 memset(v,0,sizeof(v)); 19 memset(f,-1,sizeof(f)); 20 v[s]=1;d[s]=0;q.push(s); 21 while(!q.empty()) 22 { 23 int x=q.front();q.pop();v[x]=0; 24 for(int i=head[x];i!=-1;i=e[i].nex) 25 { 26 if(!e[i].w||d[e[i].to]<=d[x]+e[i].c)continue; 27
int y=e[i].to; 28 d[y]=d[x]+e[i].c;f[y]=i; 29 if(!v[y]) 30 { 31 q.push(y);v[y]=1; 32 } 33 } 34 } 35 if(d[t]>inf)return 0; 36 int flow=inf; 37 for(int i=f[t];i!=-1;i=f[e[i].f]) 38 flow=min(flow,e[i].w); 39 for(int i=f[t];i!=-1;i=f[e[i].f]) 40 e[i].w-=flow,e[i^1].w+=flow,cost+=flow*e[i].c; 41 return 1; 42 } 43 int main() 44 { 45 scanf("%d%d",&m,&n); 46 s=0;t=n+m+1;memset(head,-1,sizeof(head)); 47 for(int i=1;i<=m;++i)scanf("%d",&a[i]); 48 for(int i=1;i<=n;++i)scanf("%d",&b[i]); 49 for(int i=1;i<=m;++i) 50 { 51 for(int j=1;j<=n;++j) 52 { 53 scanf("%d",&w[i][j]); 54 add(i,j+m,inf,w[i][j]); 55 } 56 } 57 for(int i=1;i<=m;++i)add(s,i,a[i],0); 58 for(int i=1;i<=n;++i)add(i+m,t,b[i],0); 59 while(spfa()); 60 printf("%d\n",cost); 61 memset(head,-1,sizeof(head)); 62 cnt=-1;cost=0; 63 for(int i=1;i<=m;++i) 64 { 65 for(int j=1;j<=n;++j) 66 { 67 add(i,j+m,inf,-w[i][j]); 68 } 69 } 70 for(int i=1;i<=m;++i)add(s,i,a[i],0); 71 for(int i=1;i<=n;++i)add(i+m,t,b[i],0); 72 while(spfa()); 73 printf("%d\n",-cost); 74 return 0; 75 }

網絡流24題之負載平衡問題