Pagini recente » Cod sursa (job #76576) | Cod sursa (job #1954529) | Cod sursa (job #3276776) | Cod sursa (job #744427) | Cod sursa (job #3191048)
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
int n, f[256][256], a[256][256], dist[256], pred[256];
// Funcție pentru implementarea algoritmului lui Bellman-Ford
int bellman() {
memset(pred, -1, sizeof(pred));
memset(dist, 0x3f3f, sizeof(dist));
dist[0] = 0;
pred[0] = 0;
int i, j, ok = 1;
while (ok == 1) {
ok = 0;
for (i = 0; i <= 2 * n + 1; ++i)
for (j = 0; j <= 2 * n + 1; ++j)
if (f[i][j] > 0 && dist[j] > dist[i] + a[i][j]) {
dist[j] = dist[i] + a[i][j];
pred[j] = i;
ok = 1;
}
}
if (pred[2 * n + 1] == -1) return 0;
return 1;
}
// Funcție pentru calcularea fluxului maxim
void flux() {
int i, j;
for (i = 1; i <= n; ++i) f[0][i] = f[n + i][2 * n + 1] = 1;
while (bellman() == 1) {
int p = 2 * n + 1;
while (p) {
f[pred[p]][p]--;
f[p][pred[p]]++;
p = pred[p];
}
}
int sum = 0;
for (i = 1; i <= n; ++i)
for (j = n + 1; j <= 2 * n; ++j)
if (!f[i][j]) sum += a[i][j];
// Scrie rezultatul în fișierul de ieșire
ofstream g("cc.out");
g << sum << endl;
g.close();
}
int main() {
// Deschide fișierul de intrare
ifstream f("cc.in");
// Citirea numărului de noduri
f >> n;
// Citirea capacităților muchiilor și inițializarea grafului
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j) {
f >> a[i][j + n];
a[j + n][i] = -a[i][j + n];
f[i][j + n] = 1;
}
f.close();
// Rezolvarea problemei și scrierea rezultatului în fișierul de ieșire
flux();
return 0;
}