Cod sursa(job #597689)

Utilizator alexeiIacob Radu alexei Data 22 iunie 2011 21:48:58
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include<stdio.h>
#include<vector>
#include<utility>
#include<deque>
#include<stdlib.h>

#define NMAX 256
#define inf 0x3f3f3f3f

using namespace std;

int Cap[NMAX][NMAX],F[NMAX][NMAX];
int N;

vector< pair< int,int > > G[NMAX];

int D[NMAX],P[NMAX];
bool viz[NMAX];
int ans;

int BF(int source, int dest)
{
	int i;
	for( i=source; i<=dest; ++i )
		D[i]=inf,viz[i]=0,P[i]=0;
		
	deque < int > Deq;
	
	Deq.push_back(source);
	D[source]=0;viz[source]=1;
	
	int nod;unsigned it;
	int v,cost;
	
	while( !Deq.empty() )
	{
		nod=Deq.front();
		Deq.pop_front();
		viz[nod]=0;
		
		for( it=0; it<G[nod].size(); ++it )
		{
			v=G[nod][it].first;
			cost=G[nod][it].second;	
			
			if( Cap[ nod ][ v ] == F[ nod ][ v ] ) 
				continue;
			
			if( D[nod]+cost<D[v] )		
			{
				D[v]=D[nod]+cost;
				P[v]=nod;
				
				if( !viz[v] )	
				{
					Deq.push_back( v );	
					viz[v]=1;
				}
			}
		}
		
	}
	
	if( D[dest]==inf )
		return 0;
	
	/*
		Compute flow
	*/
	
	int flow=inf;
	nod=dest;
	
	while( nod!=source )
	{
		flow=min( flow, Cap[ P[nod] ][ nod ]-F[ P[nod] ][ nod ] );
		nod=P[nod];
	}
	
	nod=dest;
	while( nod!=source )
	{
		F[ P[nod] ][nod]+=flow;
		F[ nod ][P[nod]]-=flow;
		nod=P[nod];
	}
	
	ans+=D[dest];
	return flow;	
}

int main()
{
	freopen("cc.in","r",stdin);
	freopen("cc.out","w",stdout);
	
	int N;
	scanf("%d",&N);
	int i,j,cost;
	for(i=1; i<=N; ++i)
		for(j=1; j<=N; ++j)
		{
			scanf("%d",&cost);
			
			Cap[i][N+j]=inf;
			G[i].push_back( make_pair( N+j,cost ) );
			G[N+j].push_back( make_pair( i,-cost ) );
		}
		
	int source=0;
	int dest=(N<<1)+1;
	for(i=1; i<=N; ++i)
	{
		Cap[source][i]=Cap[N+i][dest]=1;
		
		G[source].push_back( make_pair(i,0) );
		G[i].push_back( make_pair(source,0) );
		
		G[dest].push_back( make_pair( N+i,0) ); 
		G[N+i].push_back( make_pair( dest,0) );
	}

	ans=0;
	while( BF(source,dest) );
	
	printf("%d\n",ans);
	
	return 0;
}