记录编号 237308 评测结果 AAAAAAAAAA
题目名称 运输问题2 最终得分 100
用户昵称 Gravatar/k 是否通过 通过
代码语言 C++ 运行时间 0.006 s
提交时间 2016-03-16 19:54:01 内存使用 0.66 MiB
显示代码纯文本
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
using namespace std;
queue<int>q;
int S,T;
struct u
{
	int b;
	int z;
	int x;
}c[30000];
int d[110],h[110],l=-1,r[110];
inline void gj(int a,int b,int z)
{
	//if(z>0)
	//    printf("%d %d %d\n",a,b,z);
	c[++l].b=b;
	c[l].z=z;
	c[l].x=h[a];
	h[a]=l;
}
int n;
inline bool gb()
{
	memset(d,-1,sizeof(d));
	d[S]=0;
	q.push(S);
	while(!q.empty())
	{
		int k=q.front();
		q.pop();
	//printf("gjx%d ",k);
		for(int i=h[k];i!=-1;i=c[i].x)
		if(c[i].z>0)
		{
			int u=c[i].b;
			if(d[u]==-1)
			{
				d[u]=d[k]+1;
				q.push(u);
			}
		}
	}
	if(d[T]==-1)
	    return 0;
	    //printf("sx");
	return 1;
}
inline int gd(int k,int s)
{
    if(k==T||s==0)
    {
        return s;
    }
    int used=0;
    for(int i=h[k];i!=-1;i=c[i].x)
    if(c[i].z>0)
    {
        int u=c[i].b;
        if(d[u]==d[k]+1)
        {
            int x=gd(u,min(s-used,c[i].z));
            if(x>0)
            {
                c[i].z-=x;
                c[i^1].z+=x;
                used+=x;
                if(used==s)
                    return used;
            }
            else
                d[u]=-1;
        }
    }
    return used;
}
int main()
{
	freopen("maxflowb.in","r",stdin);
	freopen("maxflowb.out","w",stdout);
	memset(h,-1,sizeof(h));
	scanf("%d",&n);
	S=n+1,T=n+2;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			int aa,bb;
			scanf("%d%d",&aa,&bb);
			if(bb==0)
			    continue;
			gj(i,j,bb-aa);
			gj(j,i,0);
			r[j]+=aa;
			r[i]-=aa;
		}
	}
	//printf("L%d\n",l);
	for(int i=1;i<=n;i++)
	{
		if(r[i]>0)
		{
			//printf("stone%d\n",S);
			gj(S,i,r[i]);
			gj(i,S,0);
		}
		else if(r[i]<0)
		{
			gj(i,T,-r[i]);
			gj(T,i,0);
		}
	}
	gj(n,1,0x3fffffff);
	gj(1,n,0);
	int w=0;
	//printf("USA%d   %d\n",l,h[S]);
	while(gb())
	    gd(S,0x3fffffff);
	//printf("%d\n",w);
	//getchar();
	//getchar();
	//return 0;
	c[l-1].z=0;
	S=1,T=n;
	while(gb())
	    w+=gd(S,0x3fffffff);
	printf("%d",w);
	getchar();
	getchar();
}