Cod sursa(job #585263)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 28 aprilie 2011 19:09:46
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
#define nmax 210
#define inf 1<<30

int n, u[nmax], dist[nmax], t[nmax], s, d, sol, c[nmax][nmax], cost[nmax][nmax], f[nmax][nmax];
vector <int> g[nmax];
queue <int> q;

int bellmanford()
{
	int i, nod, v;
	for (i=0; i<=d; i++) 
	{
		u[i]=0;
		dist[i]=inf;
	}
	q.push(s);
	dist[s]=0;
	u[s]=1;
	while (!q.empty())
	{
		nod=q.front();
		q.pop();
		u[nod]=0;
		for (i=0; i<g[nod].size(); i++)
		{
			v=g[nod][i];
			if (c[nod][v]!=f[nod][v])
				if (dist[nod]+cost[nod][v]<dist[v])
				{
					dist[v]=dist[nod]+cost[nod][v];
					t[v]=nod;
					if (!u[v])
					{
						q.push(v);
						u[v]=1;
					}
				}
		}
	}
	return dist[d];
}
	

int main()
{
	freopen("cc.in","r",stdin);
	freopen("cc.out","w",stdout);
	scanf("%d", &n);
	int i, j, nod, x, fm;
	for (i=1; i<=n; i++)
		for (j=1; j<=n; j++)
		{
			c[i][n+j]=inf;
			scanf("%d", &cost[i][n+j]);
			cost[n+j][i]=-cost[i][n+j];
			g[i].push_back(j+n);
			g[j+n].push_back(i);
		}
	s=0;
	d=2*n+1;
	for (i=1; i<=n; i++)
	{
		c[s][i]=1;
		g[s].push_back(i);
		g[i].push_back(s);
	}
	for (i=n+1; i<=2*n; i++)
	{
		c[i][d]=1;
		g[i].push_back(d);
		g[d].push_back(i);
	}
	while ((x=bellmanford())!=inf)
	{
		fm=5;
		nod=d;
		while (nod)
		{
			fm=min(fm, c[t[nod]][nod]-f[t[nod]][nod]);
			nod=t[nod];
		}
		nod=d;
		while (nod)
		{
			f[t[nod]][nod]+=fm;
			f[nod][t[nod]]-=fm;
			nod=t[nod];
		}
		sol+=x;
	}
	printf("%d\n",sol);
}