Cod sursa(job #123614)

Utilizator gigi_becaliGigi Becali gigi_becali Data 16 ianuarie 2008 19:27:31
Problema Cc Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
using namespace std;
#include<stdio.h>
#include <queue>
#include<string.h>
#define nmax 205
#define oo 0x3f3f3f3f
FILE *f=fopen("cc.in","r"), *g=fopen("cc.out","w");
int n, cost[nmax][nmax], cap[nmax][nmax], F[nmax][nmax],viz[nmax],y,t[nmax];
int sum;
void citire()
{

	int i,j;
	fscanf(f,"%d",&n);
	for(i=2;i<=n+1;i++)
		for(j=n+2;j<=2*n+1;j++)
		{
			fscanf(f,"%d",&y);
			cost[i][j]=y;
			cost[j][i]=-y;
			if(i+n!=j) cap[i][j]=1;
		}
	for(i=2;i<=n+1;i++) cap[1][i]=1;
	for(j=n+2;j<=2*n+1;j++) cap[j][2*n+2]=1;
}

int bellman_ford_moore()
{
	
	int i,x,Q[nmax*nmax],p,u,d[nmax];
	memset(d,oo, sizeof(d));
	memset(viz, 0, sizeof(viz));
	Q[0]=1;
	d[1]=0;
	viz[1]=1;
	t[1]=-1;
	p=u=0;
	while(p<=u)
	{
		x=Q[p++];
		//viz[x]=0;
		for(i=2;i<=2*n+2;i++)
		if(F[x][i]<cap[x][i])
		{
			if(cost[x][i]+d[x]<d[i])
			{
				d[i]=cost[x][i]+d[x];
				if(!viz[i])
				{
					t[i]=x;
					viz[i]=1;
					Q[++u]=i;
				}
			}
		}
	}
	
	if(viz[2*n+2]) return 0;
	return 1;
}

int b_f_m()
{
	int Q[nmax*nmax], p=0, u=0;
	int x, d[nmax],i;
	memset(d, oo, sizeof(d));
	memset(t, 0, sizeof(t));
	d[1]=0;
	Q[0]=1;
	
	while(p<=u)
	{
		x=Q[p++];
		
		for(i=1;i<=2*n+2;++i)
			if(cap[x][i]>F[x][i])
				if(d[x]+cost[x][i] < d[i])
					d[i]=d[x]+cost[x][i],
					t[i]=x, 
					Q[++u]=i;
	}
	
	return t[2*n+2];
	
}

void ek()
{
	int i;
	memset(viz,0,sizeof(viz));
	do{
		if(!b_f_m()) return;
		for(i=2*n+2;i!=1;i=t[i])
		{
			F[t[i]][i]++;
			F[i][t[i]]--;
		}
	}while(1);
}

void afis()
{
	int i,j;
	for(i=2;i<=n+1;i++)
		for(j=n+2;j<=2*n+1;j++)
			if(F[i][j])
				sum+=cost[i][j];
	
	
	fprintf(g,"%d\n",sum);
	printf("%d\n", sum);
	/*for(i=1;i<=2*n+2;i++)
	{
		for(j=1;j<=2*n+2;j++) fprintf(g,"%d ",F[i][j]);
		fprintf(g,"\n");
	}*/
}

int main()
{
	citire();
	ek();
	afis();
	return 0;
}