Cod sursa(job #2593056)

Utilizator toadehuPuscasu Razvan Stefan toadehu Data 2 aprilie 2020 19:50:03
Problema Cc Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <bits/stdc++.h>

const int inf = 2e9;

using namespace std;

int n;

int cst[209][209];

int s,d;

int flo[209][209],cap[209][209],dist[209],dad[209],ans;

vector<int> g[209];

queue<int> q;

bool inq[209];


bool bellman()
{
    for(int i=0; i<=2*n+1; ++i)
    {
        dist[i]=inf;
    }
    dist[s]=0;
    q.push(s);
    while(!q.empty())
    {
        int cn=q.front();
        q.pop();
        inq[cn]=false;
        for(auto it : g[cn])
        {
            int v=dist[cn]+cst[cn][it];
            if(v<dist[it] && flo[cn][it]<cap[cn][it])
            {
                dist[it]=v;
                dad[it]=cn;
                if(!inq[it])
                {
                    q.push(it);
                }
            }
        }
    }
    return dist[d]!=inf;
}

void douaparticele()
{
    s=0,d=2*n+1;
    for(int i=1; i<=n; ++i)
    {
        cap[s][i]=cap[i+n][d]=1;
        g[s].push_back(i);
        g[i+n].push_back(d);
    }
}

void updateflux()
{
    int fmin=inf;
    for(int cn=d; cn!=s; cn=dad[cn])
    {
        fmin=min(fmin,cap[dad[cn]][cn]-flo[dad[cn]][cn]);
    }
    for(int cn=d; cn!=s; cn=dad[cn])
    {
        flo[dad[cn]][cn]+=fmin;
        flo[cn][dad[cn]]-=fmin;
    }
    ans+=dist[d]*fmin;
}

int main()
{

    ifstream fin("cc.in");
    ofstream fout("cc.out");
    fin>>n;
    for(int i=1; i<=n; ++i)
    {
        for(int j=1; j<=n; ++j)
        {
            fin>>cst[i][j+n];
            cst[j+n][i]=-cst[i][j+n];
            g[i].push_back(j+n);
            g[j+n].push_back(i);
            cap[i][j+n]=1;
        }
    }
    douaparticele();
    while(bellman())
    {
        updateflux();
    }
    fout<<ans;
    return 0;
}