Cod sursa(job #1075331)

Utilizator superman_01Avramescu Cristian superman_01 Data 8 ianuarie 2014 21:11:33
Problema Cc Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <queue>

#define NMAX 105
#define INF 0x3f3f3f3f

using namespace std;

ifstream in ( "cc.in" );
ofstream out ( "cc.out" );

int N , Source , Dest , Answer ;
int Cost[NMAX][NMAX] , C[NMAX][NMAX]  ,F[NMAX][NMAX], dist[NMAX] , TT[NMAX];
bool used[NMAX];
queue < int > Q;

bool BellmanFord ( void )
{
	int i , j ;
    memset( dist , INF , sizeof(dist) );
	memset( used , 0 , sizeof (used) );
    Q.push( Source );
    used[ Source ] = true ;
    dist[ Source ] = 0 ;
    while ( !Q.empty() )
    {
        int node = Q.front() ; 
        Q.pop() , used[node] = false ;
		for ( i = 1 ; i <= Dest ; ++i )
			if ( F[node][i] < C[node][i] && dist[node] + Cost[node][i] < dist[i] )
			{
				dist[i] = dist[node] + Cost[node][i];
				TT[i] = node;
				if ( !used[i] )
					Q.push(i) , used[i] = true;
			}
    }
    return ( dist[Dest] != INF );
}
void Cuplaj ( void )
{
	int i ;
	 for ( ; BellmanFord(); )
    {
        for ( i = Dest ; i != Source ; i = TT[i] )
         ++F[TT[i]][i] , --F[i][TT[i]];
        Answer += dist[Dest];       
    }
  
}

int main ( void )
{
	int i , j ;
	in >> N ; 
	Source = 0 ;
	Dest =  N + N + 1;
	for ( i = 1 ; i <= N ; ++i )
		for ( j = 1 ; j <= N ; ++j )
		{
			in >> Cost[i][j+N];
			Cost[j+N][i] = -Cost[i][j+N];
			C[i][j+N] = 1 ;
		}
	for ( i = 1 ; i <= N ; ++i )
		C[Source][i] = C[i+N][Dest] = 1 ;
	Cuplaj();
	out << Answer << "\n";
	in.close();
	out.close();
	return 0;
	
}