记录编号 395963 评测结果 AAAAAAAAAA
题目名称 [网络流24题] 运输问题 最终得分 100
用户昵称 GravatarJustWB 是否通过 通过
代码语言 C++ 运行时间 0.025 s
提交时间 2017-04-17 17:48:02 内存使用 8.01 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<vector>
#include<algorithm>
#include<stack>
#include<string>
#define inf 0x7fffff
using namespace std;
int n,m,tmp;
int zx[1002][1002];
int zd[1002][1002];
int zq[1002],cc[1002];
bool pan[1002];
vector<pair<int,int> > xf[1002];
vector<pair<int,int> > df[1002];
queue<int> q;
bool spfax()
{
	memset(cc,0x7f,sizeof(cc));
	memset(zq,0,sizeof(zq));
	pan[0]=1;q.push(0);cc[0]=0;
	while(!q.empty())
	{
		int now=q.front();
		pan[now]=0;q.pop();
		for(int i=0;i<xf[now].size();i++)
		{
			int md=xf[now][i].first,fy=xf[now][i].second;
			if(cc[now]+fy<cc[md]&&zx[now][md]!=0)
			{
				cc[md]=cc[now]+fy;
				zq[md]=now;
				if(!pan[md])
				{
					q.push(md);
					pan[md]=1;
				}
			}
		}
	}
	if(zq[1001]==0)return 0;
	return 1;
}
bool spfad()
{
	memset(cc,0x7f,sizeof(cc));
	memset(zq,0,sizeof(zq));
	pan[0]=1;q.push(0);cc[0]=0;
	while(!q.empty())
	{
		int now=q.front();
		pan[now]=0;q.pop();
		for(int i=0;i<df[now].size();i++)
		{
			int md=df[now][i].first,fy=df[now][i].second;
			if(cc[now]+fy<cc[md]&&zd[now][md]!=0)
			{
				cc[md]=cc[now]+fy;
				zq[md]=now;
				if(!pan[md])
				{
					q.push(md);
					pan[md]=1;
				}
			}
		}
	}
	if(zq[1001]==0)return 0;
	return 1;
}
int dfsx(int now,int flo)
{
	while(zq[now]!=0)
	{
		flo=min(flo,zx[zq[now]][now]);
		if(zq[now]==0)break;
		now=zq[now];
	}
	flo=min(flo,zx[0][now]);
	now=1001;
	while(zq[now]!=0)
	{
		zx[zq[now]][now]-=flo;
		zx[now][zq[now]]+=flo;
		if(zq[now]==0)break;
		now=zq[now];
	}
	zx[0][now]-=flo;zx[now][0]+=flo;
	return flo;
}
int dfsd(int now,int flo)
{
	while(zq[now]!=0)
	{
		flo=min(flo,zd[zq[now]][now]);
		if(zq[now]==0)break;
		now=zq[now];
	}
	flo=min(flo,zd[0][now]);
	now=1001;
	while(zq[now]!=0)
	{
		zd[zq[now]][now]-=flo;
		zd[now][zq[now]]+=flo;
		if(zq[now]==0)break;
		now=zq[now];
	}
	zd[0][now]-=flo;zd[now][0]+=flo;
	return flo;
}
int main()
{
	freopen("tran.in","r",stdin);
	freopen("tran.out","w",stdout);
	scanf("%d%d",&m,&n);
	for(int i=1;i<=m;i++)
	{
		scanf("%d",&zx[0][i]);
		zd[0][i]=zx[0][i];
		xf[0].push_back(make_pair(i,0));
		xf[i].push_back(make_pair(0,0));
		df[0].push_back(make_pair(i,0));
		df[i].push_back(make_pair(0,0));
	}
	for(int i=m+1;i<=m+n;i++)
	{
		scanf("%d",&zx[i][1001]);
		zd[i][1001]=zx[i][1001];
		xf[1001].push_back(make_pair(i,0));
		xf[i].push_back(make_pair(1001,0));
		df[1001].push_back(make_pair(i,0));
		df[i].push_back(make_pair(1001,0));
	}
	for(int i=1;i<=m;i++)
	{
		for(int j=m+1;j<=m+n;j++)
		{
			int lin;
			scanf("%d",&lin);
			zx[i][j]=inf;
			zd[i][j]=inf;
			xf[i].push_back(make_pair(j,lin));
			xf[j].push_back(make_pair(i,-lin));
			df[i].push_back(make_pair(j,-lin));
			df[j].push_back(make_pair(i,lin));
		}
	}
	while(spfax())
	{
		tmp+=cc[1001]*dfsx(1001,inf);
	}
	printf("%d\n",tmp);
	tmp=0;
	while(spfad())
	{
		tmp+=cc[1001]*dfsd(1001,inf);
	}
	printf("%d",-tmp);
	return 0;
}