Cod sursa(job #1516593)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 3 noiembrie 2015 11:01:31
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <fstream>
#include <bitset>
#include <vector>
#define INF 0x3f3f3f3f
#define DIM 205
#include <queue>

using namespace std;

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

int N, minim, flux, Cost;
vector <int> v[DIM];
bitset <DIM> U;
int T[DIM];
int D[DIM];
queue <int> Q;
int C[DIM][DIM],F[DIM][DIM],X[DIM][DIM];

int BF(){
    U.reset();
    for(int i=1;i<=2*N+1;i++)
        D[i]=INF;
    D[0]=0;
    U[0]=1;
    Q.push(0);
    while(!Q.empty()){
        int node = Q.front();
        Q.pop();
        U[node]=0;
        for(vector <int>::iterator it=v[node].begin();it!=v[node].end();it++){
            if(C[node][*it] > F[node][*it] && D[*it] > D[node] + X[node][*it]){
                D[*it] = D[node] + X[node][*it];
                T[*it] = node;
                if(!U[*it]){
                    U[*it]=1;
                    Q.push(*it);
                }
            }
        }
    }
    return D[2*N+1] != INF;
}

int main(){
    fin >> N;

    for(int i=1;i<=N;i++)
        for(int j=1;j<=N;j++){
            int x;
            fin >> x;
            v[i].push_back(j+N);
            v[j+N].push_back(i);
            C[i][j+N]=1;
            X[i][j+N]=x;
            X[j+N][i]=-x;
        }
    for(int i=1;i<=N;i++){
        v[i].push_back(0);
        v[0].push_back(i);
        v[i+N].push_back(2*N+1);
        v[2*N+1].push_back(i+N);
        C[0][i] = 1;
        C[N+i][2*N+1] = 1;
    }

    while(BF()){
        minim = INF;
        int u = 2*N+1;
        while(u!=0){
            if(minim > C[T[u]][u] - F[T[u]][u])
                minim = C[T[u]][u] - F[T[u]][u];
            u=T[u];
        }
        u= 2*N+1;
        while(u!=0){
            Cost += minim * X[T[u]][u];
            F[T[u]][u] += minim;
            F[u][T[u]] -= minim;
            u=T[u];
        }
    }

    fout << Cost << "\n";
}