Cod sursa(job #2197449)

Utilizator andreiudilaUdila Andrei andreiudila Data 22 aprilie 2018 10:56:40
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream cin("cc.in");
ofstream cout("cc.out");

vector<int> v[400];
int cap[400][400];
int cost[400][400],t[400],dmin[400];
int q[130000],viz[400];
int x,y,c,z,n,m,s,d,i,j,flux,costf;
int inf = 2000000000;
int cmin = inf;
bool drum_minim(int s, int d)
{
    memset(viz,0,sizeof(viz));
    viz[s]=1;
    int st = 1,en=1;
    q[st] = s;
    t[s]=-1;
    dmin[s]=0;
    for(int i=1; i<=2*n+1; ++i)
        if(i!=s)
            dmin[i]=inf;

    while(st<=en)
    {
        int nod = q[st];
        ++st;
        viz[nod]=0;

        for(int i=0; i<v[nod].size(); ++i)
        {
            if(cap[nod][v[nod][i]] > 0
                    && dmin[nod] + cost[nod][v[nod][i]] < dmin[v[nod][i]])
            {
                dmin[v[nod][i]] = dmin[nod] + cost[nod][v[nod][i]];
                if(!viz[v[nod][i]])
                {
                    ++en;
                    q[en]=v[nod][i];
                    viz[v[nod][i]]=1;
                }
                t[v[nod][i]] = nod;
            }
        }
    }

    if(dmin[d] != inf) return 1;
    return 0;
}
int main()
{
    cin>>n;
    for(i=1; i<=n; ++i)
        for(j=1;j<=n;++j)
    {
        cin>>z;
        x=i;
        y = j;
        y+=n;

        v[x].push_back(y);
        cap[x][y]=1;
        cost[x][y]=z;
        v[y].push_back(x);
        cap[y][x]=0;
        cost[y][x]=-z;
    }

    for(i=1;i<=n;++i)
    {
        v[0].push_back(i);
        v[i].push_back(0);
        cap[0][i]=1;
        cap[i][0]=0;

    }

    for(i=n+1;i<=2*n;++i)
    {
        v[2*n+1].push_back(i);
        v[i].push_back(2*n+1);
        cap[i][2*n+1]=1;
    }

    int nod = d;
    s = 0;
    d=2*n+1;
    while(drum_minim(s,d))
    {
        nod = d;
        cmin = inf;
        while(nod != s)
        {
            cmin = min(cmin,cap[t[nod]][nod]);
            nod = t[nod];
        }

        flux += cmin;
        costf += dmin[d]*cmin;

        nod = d;
        while(nod !=s)
        {
            cap[nod][t[nod]] += cmin;
            cap[t[nod]][nod] -= cmin;
            nod = t[nod];
        }

    }

    cout<<costf;
    return 0;
}