Pagini recente » Cod sursa (job #3280265) | Cod sursa (job #260547) | Cod sursa (job #831612) | Cod sursa (job #1061451) | Cod sursa (job #23269)
Cod sursa(job #23269)
#include <stdio.h>
#define MaxN 30
#define INF 1000001
int N, M;
int C[MaxN][MaxN], F[MaxN][MaxN], cost[MaxN][MaxN];
int t[MaxN], d[MaxN], e[30001][3];
int dist;
int augment()
{
int i, j, pas, ok = 1, k, c;
for (i = 0; i <= 2*N+1; i++) t[i] = -1, d[i] = INF;
d[0] = 0;
for (pas = 1; pas < 2*N+1 && ok; pas++)
for (ok = 0, k = 1; k <= M; k++)
{
i = e[k][0];
j = e[k][1];
c = e[k][2];
if (C[i][j] > F[i][j] && d[j] > d[i] + c)
{
d[j] = d[i] + c;
t[j] = i;
ok = 1;
}
if (C[j][i] > F[j][i] && d[i] > d[j] - c)
{
d[i] = d[j] - c;
t[i] = j;
ok = 1;
}
}
if (d[2*N+1] != INF) return 1;
return 0;
}
void update()
{
int i, j;
for (i = 2*N+1; i != 0; i = t[i])
F[t[i]][i] += 1, F[i][t[i]] -= 1;
dist += d[2*N+1];
}
void flux_mcm()
{
while (augment())
update();
}
int main()
{
int i, j;
FILE *fin = fopen("cc.in", "rt");
FILE *fout = fopen("cc.out", "wt");
fscanf(fin, "%d", &N);
for (i = 1; i <= N; i++)
for (j = 1; j <= N; j++)
{
fscanf(fin, "%d", &cost[i][N+j]);
e[++M][0] = i, e[M][1] = j+N, e[M][2] = cost[i][N+j];
}
for (i = 1; i <= N; i++)
for (j = N+1; j <= 2*N; j++) C[i][j] = 1;
for (i = 1; i <= N; i++)
{
e[++M][0] = 0, e[M][1] = i, e[M][2] = 0;
e[++M][0] = N + i, e[M][1] = 2*N+1, e[M][2] = 0;
C[0][i] = C[N+i][2*N+1] = 1;
}
flux_mcm();
fprintf(fout, "%d", dist);
fclose(fin);
fclose(fout);
return 0;
}