Cod sursa(job #1518028)

Utilizator robx12lnLinca Robert robx12ln Data 5 noiembrie 2015 10:51:47
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include<fstream>
#include<deque>
#include<vector>
#define DIM 305
#define INF 1000000000
using namespace std;
ifstream fin("cc.in");
ofstream fout("cc.out");
int Z[DIM][DIM] , C[DIM][DIM] , F[DIM][DIM];
int V[DIM] , T[DIM] , D[DIM] ,s,d,n;
vector<int> L[DIM];
deque<int> q;
int bf(){
    int nod,vecin,ok=0;
    for(int i=1;i<=d;i++){
        D[i]=INF;
    }
    q.push_back(s);
    D[s]=0;
    V[s]=1;
    while( !q.empty() ){
        nod = q.front();
        for(int i=0 ; i<L[nod].size() ; i++ ){
            vecin=L[nod][i];
            if( C[nod][vecin] > F[nod][vecin] && D[vecin] > D[nod] + Z[nod][vecin] ){
                D[vecin] = D[nod] + Z[nod][vecin];
                T[vecin]=nod;
                if( V[vecin] == 0){
                    V[vecin] = 1;
                    q.push_back(vecin);
                    if(vecin == d) ok=1;
                }
            }

        }
        q.pop_front();
        V[nod]=0;
    }
    return ok;
}
int c,minim,cost;
int main(){
    fin>>n;

    for( int i = 1 ; i <= n ; i++ ){
        for( int j = 1 ; j <= n ; j++ ){
            fin>> c;
            //
            L[i].push_back(j+n);
            L[j+n].push_back(i);
            C[i][j+n]=1;
            Z[i][j+n]= c;
            Z[j+n][i]=-c;
            //

        }
        //
        L[0].push_back(i);
        L[i].push_back(0);
        C[0][i]=1;
        //
        L[i+n].push_back(2*n+1);
        L[1+2*n].push_back(n+i);
        C[n+i][2*n+1]=1;
    }
    s=0;
    d=2*n+1;
    while( bf() == 1 ){

        minim = INF;

        for( int i = d ; i != s ; i=T[i] ){
            minim=min(minim , C[ T[i] ][i] - F[ T[i] ][i] );
        }
        for( int i = d ; i != s ; i=T[i] ){
            F[ T[i] ][i] += minim;
            F[i][ T[i] ] -= minim;
            cost += minim * Z[ T[i] ][i];
        }

    }
    fout<<cost<<"\n";
    return 0;
}