Cod sursa(job #197396)

Utilizator andreidragusAndrei Dragus andreidragus Data 3 iulie 2008 23:32:13
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <stdio.h>
#include <set>
#include <vector>
#define inf 10000000
#define pb push_back



using namespace std;

int n,s,t;
int flow[202][202];
int cost[202][202];
int cap[202][202];
int prec[202];
int dist[202];

int total;


int gaseste_drum()
{
	for(int i=0;i<202;i++)prec[i]=-1;
	for(int i=0;i<202;i++)dist[i]=inf;
	dist[s]=0;
	
	for(int i=0;i<50;i++)
		for(int u=0;u<t+1;u++)
			for(int v=0;v<t+1;v++)
				if( (cap[u][v] - flow[u][v]) > 0 && dist[v]> dist[u]+cost[u][v] )
				{
					dist[v]= dist[u]+cost[u][v];
					prec[v]=u;
				}
		
	if(prec[t]==-1)return 0;
	return 1;
	
}

void pompeaza()
{
	int min=10000;
	int sum=0;
	int v=t;
	
	while(prec[v]!=-1)
	{
		int u=prec[v];
		sum+=cost[u][v];
		if(cap[u][v] - flow[u][v] <min) min=cap[u][v] - flow[u][v];
		v=u;
	}
	
	v=t;
	
	while(prec[v]!=-1)
	{
		int u=prec[v];
		flow[u][v]+=min;
		flow[v][u]-=min;
		//cost[v][u]=-cost[u][v];
		v=u;
	}
		
		
	total+=min*sum;
	
}

int main()
{
	FILE *in=fopen("cc.in","r");
	FILE *out=fopen("cc.out","w");
	
	fscanf(in,"%d",&n);
	
	memset(cap,0,202*202*4);
	memset(flow,0,202*202*4);
	
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
		{	
						
			fscanf(in,"%d",&cost[i][n+j]);
			cost[n+j][i]=-cost[i][n+j];
			cap[i][n+j]=1;
			cap[n+j][i]=0;
			
		}
		
	s=2*n;
	t=2*n+1;
	
	for(int i=0;i<n;i++)
	{
		cost[s][i]=0;
		cap[s][i]=1;
		//cost[i][s]=0;
		//cap[i][s]=1;
	}
	
	for(int i=0;i<n;i++)
	{
	//	cost[t][n+i]=0;
	//	cap[t][n+i]=1;
		cost[n+i][t]=0;
		cap[n+i][t]=1;
	}
	

	
	
	
	while(gaseste_drum())pompeaza();
	
	
	
	fprintf(out,"%d",total);
	fclose(in);
	fclose(out);
	
	return 0;
}