Cod sursa(job #2485746)

Utilizator DanutAldeaDanut Aldea DanutAldea Data 1 noiembrie 2019 22:39:54
Problema Cc Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <fstream>
#include <vector>
#include <bitset>
#include <deque>
#define inf 1000000000
using namespace std;

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

int n,m,i,j,c[210][210],flux[210][210],z[210][210],D[210],t[210],nod,vec,sol;
vector <int> l[210];
deque <int> q;
bitset <210> f;
bool ok;

bool bell(){
    f.reset();
    for(i=1;i<=n+n+1;i++)
        D[i]=inf;
    D[0]=0;
    f[0]=1;
    q.push_back(0);
    ok=0;

    while(!q.empty()){
        nod=q.front();
        f[nod]=0;
        q.pop_front();

        if(nod==n+n+1)
            ok=1;

        for(i=0;i<l[nod].size();i++){
            vec=l[nod][i];

            if(D[vec]>D[nod]+z[nod][vec] && c[nod][vec]-flux[nod][vec]>0){
                D[vec]=D[nod]+z[nod][vec];
                t[vec]=nod;

                if(f[vec]==0){
                    f[vec]=1;
                    q.push_back(vec);
                }
            }
        }
    }

    return ok;
}

int main(){
    fin>>n;
    for(i=1;i<=n;i++){
        l[0].push_back(i);
        l[i].push_back(0);
        c[0][i]=1;

        for(j=1;j<=n;j++){
            l[i].push_back(j+n);
            l[j+n].push_back(i);
            c[i][j+n]=1;
            fin>>z[i][j+n];
            z[j+n][i]=-z[i][j+n];
        }

        l[i+n].push_back(n+n+1);
        l[n+n+1].push_back(i+n);
        c[i+n][n+n+1]=1;
    }

    while(bell()){
        nod=n+n+1;
        m=inf;

        while(nod!=0){
            m=min(m,c[t[nod]][nod]-flux[t[nod]][nod]);
            nod=t[nod];
        }

        nod=n+n+1;
        while(nod!=0){
            flux[t[nod]][nod]+=m;
            flux[nod][t[nod]]-=m;
            nod=t[nod];
        }

        sol+=m*D[n+n+1];
    }

    fout<<sol;

    return 0;
}