过水不解释
#include<bits/stdc++.h> using namespace std; long long tot=-1,sum=0,h[1005],flow[1005],g[1005],ans=0,dis[1005],ans2=0,inf=999999; bool vis[1005]; struct node{ long long from,to,next,rest,cost; }e[10000005]; void add(long long x,long long y,long long z,long long hg){ tot++; e[tot].next=h[x]; h[x]=tot; e[tot].cost=hg; e[tot].from=x; e[tot].to=y; e[tot].rest=z; } int bfs(long long s,long long t){ queue<int>q; q.push(s);dis[s]=0;vis[s]=true; while(!q.empty()){ long long u=q.front();q.pop();vis[u]=false; for(int i=h[u];i!=(-1);i=e[i].next){ if(e[i].rest>0&&dis[e[i].to]>dis[u]+e[i].cost){ flow[e[i].to]=min(flow[u],e[i].rest); dis[e[i].to]=dis[u]+e[i].cost; g[e[i].to]=i; if(vis[e[i].to]==false)q.push(e[i].to),vis[e[i].to]=true; } } } } int EK(long long s,long long t){ while(1){ memset(flow,0x7f,sizeof(flow)); memset(dis,0x7f,sizeof(dis)); memset(g,-1,sizeof(g)); memset(vis,false,sizeof(vis)); bfs(s,t); if(g[t]!=(-1)){ ans+=flow[t];ans2+=dis[t]*flow[t]; for(int p=t;p!=s;p=e[g[p]].from){ e[g[p]].rest-=flow[t]; e[g[p]^1].rest+=flow[t]; } } else break; } } void init(){ memset(h,-1,sizeof(h)); tot=-1; ans=0; ans2=0; } int n,pj,r[105]; int main(){ init(); cin>>n; for(int i=1;i<=n;i++){ cin>>r[i]; sum+=r[i]; } pj=sum/n; for(int i=1;i<=n;i++){ add(0,i,r[i],0); add(i,0,0,0); add(i,n+1,pj,0); add(n+1,i,0,0); if(i==n)add(i,1,inf,1),add(1,i,0,-1); else add(i,i+1,inf,1),add(i+1,i,0,-1); if(i==1)add(i,n,inf,1),add(n,i,0,-1); else add(i,i-1,inf,1),add(i-1,i,0,-1); } EK(0,n+1); cout<<ans2<<endl; }
原文地址:https://www.cnblogs.com/shatianming/p/12227571.html
时间: 2024-10-13 19:55:58