Cod sursa(job #282559)

Utilizator alisssiaMititelu Andra alisssia Data 17 martie 2009 21:51:55
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
using namespace std;
#include<cstdio>
#include<queue>
#define inf 0x3f3f3f3f
int cost[202][202],f[202][202],cap[202][202],n,s=0,des,t[202],inq[202],d[202];
queue<int>Q;
void read()
{
	int i,j;
	freopen("cc.in","r",stdin);
	scanf("%d",&n);
	des=2*n+1;
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
		{
			scanf("%d",&cost[i][n+j]);
			cost[n+j][i]=-cost[i][n+j];
			cap[i][n+j]=1;
		}
	for(i=1;i<=n;i++)
	{
		cap[0][i]=1;
		cap[n+i][des]=1;
	}
}

int bellman()
{
	int i,x;
	for(i=0;i<=2*n+2;i++) {inq[i]=0;t[i]=-1;d[i]=inf; }
	Q.push(s);
	inq[s]=1;
	t[s]=0;
	d[s]=0;
	while(!Q.empty())
	{
		x=Q.front();
		Q.pop();
		inq[x]=0;
		for(i=1;i<=2*n+1;i++)
			if(f[x][i]<cap[x][i] && d[i]>d[x]+cost[x][i])
			{
				d[i]=d[x]+cost[x][i];
				t[i]=x;
				if(!inq[i])
				{
					inq[i]=1;
					Q.push(i);
					
				}
			}
	}
	if(t[des]!=-1) return 1;
	return 0;
}

void flux()
{
	int i;
	while(bellman())
	{
		for(i=des;i;i=t[i])
			{
				f[t[i]][i]++;
				f[i][t[i]]--;
		}
	}
}

int main()
{
	read();
	flux();
	int cmin=0,i,j;
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			if(f[i][n+j]) cmin+=cost[i][n+j];
	freopen("cc.out","w",stdout);
			printf("%d",cmin);
	return 0;
}