Cod sursa(job #3183589)

Utilizator opreaopreacalin@gmail.comCalin Oprea [email protected] Data 12 decembrie 2023 13:34:33
Problema Cc Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <fstream>
#include <iostream>
using namespace std;

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

int i, j, k, n, v[202][202], c[202][202], fl[202][202], o[202], h[202], cc[10001], p, q, t, l;
long long e=0; //cost total

int main()
{
    in >> n;
    for(i = 1; i <= n; i++)
        for(j = 1; j <= n; j++)
        {
            in >> k;
            //setare costuri
            v[i][n + j + 1] = k;
            v[n + j + 1][i] = -k;
            //setare capacit pe muchia i
            c[i][n + j  + 1] = 1;
        }
    for(i=1;i<=n;i++)
    {
        c[0][i] = c[i + n + 1][n + 1] = 1;
        v[0][i] = v[i + n + 1][n + 1] = 0;
    }
    //BFS
    while(1)
    {
        for(i=1;i<=2*n+1;i++)
        {
            o[i]=0;
            h[i]=10001;
        }
        h[0]=0;
        p=0;
        q=0;
        cc[q++]=0;
        while(p<q)
        {
            t=cc[p++]; //nod curr
            if(t && t <=n) //dc t e nod sursa
            {
                for(i = n + 1; i <= 2 * n + 1; i++)
                    if(fl[t][i] < c[t][i] && h[i] > h[t] + v[t][i]) //dc fluxul se poate mari cu muchia t,i
                        cc[q++] = i, o[i] = t, h[i] = h[t] + v[t][i];
            }
            else //dc t e nod interm/dest
                for(i = 1; i <= n + 1; i++)
                    if(fl[t][i] < c[t][i] && h[i] > h[t] + v[t][i]) //dc fluxul se poate mari cu muchia t,i
                        cc[q++] = i, o[i] = t, h[i] = h[t] + v[t][i];
        }
        //dc exista un drum
        if(!o[n+1])
            break;
        //act mat de flux cu drumul gasit
        for(l=n+1;l!=0;l=o[l])
        {
            fl[o[l]][l]++;
            fl[l][o[l]]--;
        }
        //act costului
        e+=h[n + 1];
    }
    out<<e;

    return 0;
}