Pagini recente » Cod sursa (job #2806419) | Cod sursa (job #77703) | Cod sursa (job #2101374) | Cod sursa (job #110755) | Cod sursa (job #2250634)
#include<fstream>
using namespace std;
ifstream in ("cc.in");
ofstream out ("cc.out");
int c[203*203],coada[203*203], tata[204],flux[204][204],cap[204][204],hz[204],cost[204][204];
long long total;
int n,s,f;
bool bellmanford () {
for (int i = s; i <= f; i ++) {
c[i] = 0;
hz[i] = 0;
tata[i] = 0;
}
c[s] = 1;
hz[s] = 1;
coada[1] = s;
for (int st = 1, dr = 1; st <= dr; st ++) {
int a = coada[st];
for (int i = s; i <= f; i ++ ) {
int b = i;
if (flux[a][b] < cap[a][b] && (c[b] > c[a] + cost[a][b] || tata[b] == 0)) {
if (hz[b] == 0) {
hz[b] = 1;
coada[++dr] = b;
c[b] = c[a] + cost[a][b];
}
else {
c[b] = c[a] + cost[a][b];
}
tata[b] = a;
}
}
hz[a] = 0;
}
if (tata[f] != 0) {
return 1;
}
return 0;
}
int main (void) {
in >> n;
s = 0, f = n+n+1;
for (int i = 1; i <= n; i ++) {
for (int j = n+1; j <= n+n; j ++) {
in >> cost[i][j];
cost[j][i] = -cost[i][j];
cap[i][j] = 1;
}
}
for (int i = 1; i <= n; i ++) {
cost[s][i] = 0;
cap[s][i] = 1;
}
for (int i = n+1; i <= n+n; i ++) {
cost[i][f] = 0;
cap[i][f] = 1;
}
while (bellmanford ()) {
int x = f, minim = 1e9,a,b;
while (x != s) {
b = x;
a = tata[x];
minim = min (cap[a][b] - flux[a][b], minim);
x = tata[x];
}
x = f;
while (x != s) {
b = x;
a = tata[x];
flux[a][b] += minim;
flux[b][a] -= minim;
total += minim * cost[a][b];
x = tata[x];
}
}
out << total;
return 0;
}