Cod sursa(job #2267669)

Utilizator liviu2000Dragomirescu Liviu liviu2000 Data 23 octombrie 2018 20:36:26
Problema Cc Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <bits/stdc++.h>
#define N 105

using namespace std;

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

int c[2*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 ;
}