Pagini recente » Cod sursa (job #3194001) | Cod sursa (job #2861390) | Cod sursa (job #956183) | Cod sursa (job #2064818) | Cod sursa (job #2267666)
#include <bits/stdc++.h>
#define N 105
using namespace std;
ifstream fin("cc.in") ;
ofstream fout("cc.out") ;
int c[N][2*N] , n , parinte[2*N] , dist[2*N] , cost[2*N][2*N] , sol ;
vector<pair<int,int> > graf[2*N] ;
void citire()
{
int i , j , x ;
fin >> n ;
for ( i = 1 ; i <= n ; i++ )
{
for ( j = 1 ; j <= n ; j++ )
{
fin >> x ;
graf[i].push_back(make_pair(j+n,x)) ;
graf[j+n].push_back(make_pair(i,-x)) ;
c[i][j+n] = 1 ;
cost[i][j+n] = x ;
cost[j+n][i] = -x ;
}
}
for ( i = 1 ; i <= n ; i++ )
{
graf[0].push_back(make_pair(i,0)) ;
c[0][i] = 1 ;
}
for ( i = n+1 ; i <= 2*n ; i++ )
{
graf[i].push_back(make_pair(2*n+1,0)) ;
c[i][2*n+1] = 1 ;
}
}
bool dij()
{
int nod , i ;
queue<int> Q ;
memset(parinte,0,sizeof(parinte)) ;
memset(dist,0x3f3f3f3f,sizeof(dist)) ;
Q.push(0) ;
dist[0] = 0 ;
while ( !Q.empty() )
{
nod = Q.front() ;
Q.pop() ;
for ( auto vec : graf[nod] )
{
if ( c[nod][vec.first] && dist[vec.first] > dist[nod] + vec.second )
{
dist[vec.first] = dist[nod] + vec.second ;
Q.push(vec.first) ;
parinte[vec.first] = nod ;
}
}
}
if ( dist[2*n+1] == 0x3f3f3f3f )
return false ;
for ( i = 2*n+1 ; i != 0 ; i = parinte[i] )
{
c[parinte[i]][i]-- ;
c[i][parinte[i]]++ ;
sol = sol+cost[parinte[i]][i] ;
}
return true ;
}
int main()
{
citire() ;
while (dij()) ;
fout << sol ;
}