Pagini recente » Cod sursa (job #2006141) | Cod sursa (job #695983) | Cod sursa (job #334564) | Cod sursa (job #127645) | Cod sursa (job #183989)
Cod sursa(job #183989)
#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#define DIM 222
#define INF 100000
using namespace std;
int N, A[DIM][DIM], C[DIM][DIM], cost[DIM][DIM], F, D[DIM], sel[DIM], sol, tata[DIM], flux[DIM][DIM];
bool BF()
{
memset(tata, -1, sizeof(tata));
for (int i = 1; i <= F; i++)
D[i] = INF;
int ok = 1;
for (int k = 0; k <= F && ok; k++)
{
ok = 0;
for (int i = 0; i <= F; i++)
for (int j = 0; j <= F; j++)
if (C[i][j] - flux[i][j] > 0)
{
if (flux[i][j] == 0 && D[j] > D[i] + cost[i][j])
{
D[j] = D[i] + cost[i][j];
tata[j] = i;
ok = 1;
}
if (flux[i][j] == -1 && D[j] > D[i] - cost[i][j])
{
D[j] = D[i] - cost[i][j];
tata[j] = i;
ok = 1;
}
}
}
if (tata[F] == -1) return false;
return true;
}
int main()
{
FILE *fin = fopen("cc.in", "r");
FILE *fout = fopen("cc.out", "w");
fscanf(fin, "%d", &N);
for (int i = 1; i <= N; i++)
for (int j = 1; j <= N; j++)
{
fscanf(fin, "%d", &A[i][j]);
C[i][N + j] = 1;
cost[i][N + j] = cost[N + j][i] = A[i][j];
}
F = 2 * N + 1;
for (int i = 1; i <= N; i++)
C[0][i] = 1;
for (int i = N + 1; i < F; i++)
C[i][F] = 1;
while (BF())
{
sol += D[F];
for (int i = F; i; i = tata[i])
{
flux[tata[i]][i]++;
flux[i][tata[i]]--;
}
}
fprintf(fout, "%d\n", sol);
fclose(fin);
fclose(fout);
return 0;
}