Cod sursa(job #2488257)

Utilizator AlexPascu007Pascu Ionut Alexandru AlexPascu007 Data 6 noiembrie 2019 16:47:34
Problema Cc Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <fstream>
#include <vector>
#include <deque>
#include <bitset>
#define DIM 210
#define inf 2000000000
using namespace std;
ifstream fin("cc.in");
ofstream fout("cc.out");
int n,i,j,sol,x,nod,vecin,fluxmin,dist[DIM],cap[DIM][DIM],flux[DIM][DIM],t[DIM],cost[DIM][DIM];
vector<int> L[DIM];
deque<int> q;
bitset<DIM> f;
int bf() {
    int gasit=0;
    f.reset();
    for (i=1;i<=2*n+1;i++)
        dist[i]=inf;
    f[0]=1, dist[0]=0;
    q.push_back(0);
    while (!q.empty()) {
        nod=q.front();
        q.pop_front();
        f[nod]=0;
        for (i=0;i<L[nod].size();i++) {
            vecin=L[nod][i];
            if (dist[vecin]>dist[nod]+cost[nod][vecin]&&cap[nod][vecin]-flux[nod][vecin]>0) {
                dist[vecin]=dist[nod]+cost[nod][vecin];
                t[vecin]=nod;
                if (f[vecin]==0) {
                    f[vecin]=1;
                    q.push_back(vecin);
                    if (vecin==2*n+1)
                        gasit=1;
                }
            }
        }
    }
    return gasit;
}
int main() {
    fin>>n;
    for (i=1;i<=n;i++) {
        for (j=1;j<=n;j++) {
            fin>>x;
            L[i].push_back(n+j);
            L[n+j].push_back(i);
            cap[i][n+j]=1;
            cost[i][n+j]=x;
            cost[n+j][i]=-x;
        }
        L[0].push_back(i);
        L[i].push_back(0);
        cap[0][i]=1;
        L[n+i].push_back(2*n+1);
        L[2*n+1].push_back(n+i);
        cap[n+i][2*n+1]=1;
    }
    while (bf()) {
        nod=2*n+1;
        fluxmin=inf;
        while (nod!=0) {
            fluxmin=min(fluxmin,cap[t[nod]][nod]-flux[t[nod]][nod]);
            nod=t[nod];
        }
        nod=2*n+1;
        while (nod!=0) {
            flux[t[nod]][nod]+=fluxmin;
            flux[nod][t[nod]]-=fluxmin;
            sol+=fluxmin*cost[t[nod]][nod];
            nod=t[nod];
        }
    }
    fout<<sol;
    return 0;
}