Pagini recente » Cod sursa (job #225583) | Cod sursa (job #953227) | Cod sursa (job #901336) | Cod sursa (job #2776194) | Cod sursa (job #3190536)
#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;
}