Cod sursa(job #3190536)

Utilizator ZiGabiZiTilica Gabriel Lucian ZiGabiZi Data 7 ianuarie 2024 18:11:30
Problema Cc Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2 kb
#include <iostream>
#include <fstream>
using namespace std;

const int PIN = 100000000;

int numConcurenti;
int capacitate[202][202];
int distanta[202][202];
int sursa, destinatie;
int d[202], parinte[202];

void urmaresteDrum(int nod) {
    if (nod) {
        capacitate[nod][parinte[nod]]++;
        capacitate[parinte[nod]][nod]--;
        urmaresteDrum(parinte[nod]);
    }
}

bool maxFlow() {
    int i, j, bol;
    for (i = sursa; i <= destinatie; ++i) {
        d[i] = PIN;
        parinte[i] = 0;
    }
    d[sursa] = 0;
    bol = 1;
    while (bol) {
        bol = 0;
        for (i = sursa; i <= destinatie; ++i) {
            if (d[i] != PIN) {
                for (j = sursa; j <= destinatie; ++j) {
                    if (capacitate[i][j] && d[j] > d[i] + distanta[i][j]) {
                        d[j] = d[i] + distanta[i][j];
                        bol = 1;
                        parinte[j] = i;
                    }
                }
            }
        }
    }
    if (parinte[destinatie]) {
        urmaresteDrum(destinatie);
    }
    return (parinte[destinatie] != 0);
}

int main() {
    ifstream f("cc.in");
    ofstream g("cc.out");
    f >> numConcurenti;
    for (int i = 1; i <= numConcurenti; ++i) {
        for (int j = 1; j <= numConcurenti; ++j) {
            f >> distanta[i][numConcurenti + j];
            distanta[numConcurenti + j][i] = -distanta[i][numConcurenti + j];
            capacitate[i][numConcurenti + j] = 1;
        }
    }
    f.close();

    sursa = 0;
    destinatie = 2 * numConcurenti + 1;
    for (int i = 1; i <= numConcurenti; ++i) {
        capacitate[sursa][i] = 1;
        capacitate[numConcurenti + i][destinatie] = 1;
    }
    while (maxFlow())
        ;
    int sumaDistante = 0;
    for (int i = 1; i <= numConcurenti; ++i) {
        for (int j = numConcurenti + 1; j <= 2 * numConcurenti; ++j) {
            if (!capacitate[i][j]) {
                sumaDistante += distanta[i][j];
            }
        }
    }
    g << sumaDistante << endl;
    g.close();
    return 0;
}