Pagini recente » Arhiva de probleme | Cod sursa (job #483418) | Cod sursa (job #1065698) | Cod sursa (job #2463463) | Cod sursa (job #1075331)
#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;
}