Cod sursa(job #1266571)

Utilizator Adrian1997Radulescu Adrian Adrian1997 Data 18 noiembrie 2014 21:34:12
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <fstream>
#include <list>
#include <queue>
#include <bitset>
#define DIM 211
#define INF 2000000011
using namespace std;
ifstream f("cc.in");
ofstream g("cc.out");
int n,minim;
int T[DIM],D[DIM];
int C[DIM][DIM],F[DIM][DIM],CT[DIM][DIM];
long long sol;

list<int> L[DIM];
queue<int> q;
bitset<DIM> viz;

inline int bellmanford(){
    register int i,nod;
    list<int>::iterator it;
    viz.reset();
    for(i=1;i<=2*n+1;i++)
        D[i]=INF,T[i]=-1;
    T[0]=-1;
    q.push(0);
    viz[0]=1;
    while(!q.empty()){
        nod=q.front(),q.pop(),viz[nod]=0;
        for(it=L[nod].begin();it!=L[nod].end();it++){
            if(C[nod][*it]>F[nod][*it] && D[nod]+CT[nod][*it]<D[*it]){
                D[*it]=D[nod]+CT[nod][*it];
                T[*it]=nod;
                if(!viz[*it])
                    viz[*it]=1,q.push(*it);
            }
        }
    }
    if(D[2*n+1]!=INF) return 1;
    return 0;
}

int main(void){
    register int i,j,x;

    f>>n;
    for(i=1;i<=n;i++){
        for(j=1;j<=n;j++){
            f>>x;
            L[i].push_back(j+n);
            L[j+n].push_back(i);
            C[i][j+n]=1;
            CT[i][j+n]=x;
            CT[j+n][i]=-x;
        }
    }

    for(i=1;i<=n;i++){
        L[0].push_back(i);
        L[i+n].push_back(2*n+1);
        C[0][i]=1;
        C[i+n][2*n+1]=1;
    }

    while(bellmanford()){
        x=2*n+1;
        while(T[x]>=0){
            F[T[x]][x]++;
            F[x][T[x]]--;
            x=T[x];
        }
        sol+=D[2*n+1];
    }
    g<<sol;
    f.close();
    g.close();
    return 0;
}