Cod sursa(job #468668)

Utilizator AndreyPAndrei Poenaru AndreyP Data 4 iulie 2010 15:50:20
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <cstdio>
#include <bitset>
#include <queue>
using namespace std;
#define N 105

int n,n1;
int c[N][N];
char f[N<<1][N<<1],cap[N<<1][N<<1];
bitset< N<<1 > inq;
int d[N<<1];
int t[N<<1];
const int inf=500010;
queue< int > q;
int sursa,dest;

inline void citire()
{
	scanf("%d",&n);
	n1=n<<1;
	sursa=n1+1;
	dest=n1+2;
	for(int i=1; i<=n; ++i)
	{
		for(int j=1; j<=n; ++j)
		{
			scanf("%d",&c[i][j]);
			cap[i][j+n]=1;
		}
	}
}

inline bool bellmanFord()
{
	for(int i=1; i<=dest; ++i)
		d[i]=inf;
	d[sursa]=0;
	inq[sursa]=1;
	q.push(sursa);

	int nod;
	while(!q.empty())
	{
		nod=q.front();
		inq[nod]=0;
		q.pop();

		if(nod<=n)
		{
			for(int i=n+1; i<=n1; ++i)
			{
				if(f[nod][i]==0 && d[i]>d[nod]+c[nod][i-n])
				{
					d[i]=d[nod]+c[nod][i-n];
					t[i]=nod;
					if(inq[i]==0)
					{
						q.push(i);
						inq[i]=1;
					}
				}
			}
			continue;
		}
		if(nod<=n1)
		{
			if(f[nod][dest]==0 && d[dest]>d[nod])
			{
				d[dest]=d[nod];
				t[dest]=nod;
			}
			for(int i=1; i<=n; ++i)
			{
				if(f[nod][i]==-1 && d[i]>d[nod]-c[i][nod-n])
				{
					d[i]=d[nod]-c[i][nod-n];
					t[i]=nod;
					if(inq[i]==0)
					{
						q.push(i);
						inq[i]=1;
					}
				}
			}
			continue;
		}
		if(nod==sursa)
		{
			for(int i=1; i<=n; ++i)
			{
				if(f[nod][i]==0 && d[i])
				{
					d[i]=0;
					t[i]=nod;
					if(inq[i]==0)
					{
						q.push(i);
						inq[i]=1;
					}
				}
			}
			continue;
		}
	}

	if(d[dest]==inf)
		return false;
	return true;
		/*if(nod==dest)
		{
			for(int i=n+1; i<=n1; ++i)
			{
				if(f[nod][i]==0 && d[i]>d[nod])
				{
					d[i]=d[nod];
					t[i]=nod;
					if(inq[i]==0)
					{
						q.push(i);
						inq[i]=1;
					}
				}
			}
			continue;
		}*/
}

inline void flux()
{
	for(int i=1; i<=n; ++i)
		cap[sursa][i]=1;
	for(int i=n+1; i<=n1; ++i)
		cap[i][dest]=1;

	int rez=0;
	while(bellmanFord())
	{
		int x=dest;
		while(x!=sursa)
		{
			++f[t[x]][x];
			--f[x][t[x]];
			x=t[x];
		}

		rez+=d[dest];
	}

	printf("%d\n",rez);
}

int main()
{
	freopen("cc.in","r",stdin);
	freopen("cc.out","w",stdout);

	citire();
	flux();

	return 0;
}