#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
const int inf=2147483647;
int n,m,s,t,idx=1,maxflow;
int to[10301],next[10301],flow[10301],cflow[10301],val[10301],head[151],
d[151],pre[151];
bool inq[151];
queue <int> q;
void add(int x,int y,int z,int w)
{
to[++idx]=y;
cflow[idx]=flow[idx]=z;
val[idx]=w;
next[idx]=head[x];
head[x]=idx;
to[++idx]=x;
cflow[idx]=flow[idx]=0;
val[idx]=-w;
next[idx]=head[y];
head[y]=idx;
return ;
}
bool spfa()
{
for(int i=s;i<=t;++i)
pre[i]=-1,d[i]=inf;
d[s]=0;
inq[s]=true;
q.push(s);
while(!q.empty())
{
int x=q.front();
q.pop();
inq[x]=false;
for(int i=head[x];i;i=next[i])
if(flow[i]&&d[to[i]]>d[x]+val[i])
{
pre[to[i]]=i;
d[to[i]]=d[x]+val[i];
if(!inq[to[i]])
{
inq[to[i]]=true;
q.push(to[i]);
}
}
}
return d[t]!=inf;
}
int mcmf()
{
int fl=0,mc=0,mf;
while(spfa())
{
mf=inf;
for(int i=pre[t];i!=-1;i=pre[to[i^1]])
mf=min(mf,flow[i]);
fl+=mf;
for(int i=pre[t];i!=-1;i=pre[to[i^1]])
{
flow[i]-=mf;
flow[i^1]+=mf;
}
mc+=d[t]*mf;
}
maxflow=fl;
return mc;
}
int main()
{
scanf("%d%d",&n,&m);
s=0,t=n+m+1;
for(int i=1;i<=n;++i)
{
int a;
scanf("%d",&a);
add(s,i,a,0);
}
for(int i=1;i<=m;++i)
{
int a;
scanf("%d",&a);
add(n+i,t,a,0);
}
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
{
int a;
scanf("%d",&a);
add(i,n+j,inf,a);
}
printf("%d\n",mcmf());
for(int i=2;i<=idx;++i)
{val[i]=-val[i];flow[i]=cflow[i];}
printf("%d",-mcmf());
return 0;
}
网络流24题 运输问题 最小费用最大流 模版
最新推荐文章于 2024-01-15 22:21:54 发布