Pagini recente » Cod sursa (job #2454125) | Cod sursa (job #3162974) | Cod sursa (job #761872) | Cod sursa (job #2930275) | Cod sursa (job #51185)
Cod sursa(job #51185)
#include <stdio.h>
#define NMAX 202
#define CMAX (1<<14)
#define INF 666666
int A[NMAX][NMAX], N;
int F[NMAX][NMAX], InQ[CMAX], Q[CMAX], C[NMAX][NMAX], CM, D[NMAX];
int cup[NMAX];
void flux(int sursa)
{
int p1 = 0, p2 = 1, i, j, nod, tata[NMAX], tip[NMAX], min;
for (i = 0; i < NMAX; i++)
D[i] = INF, InQ[i] = tata[i] = tip[i] = 0;
Q[p1] = sursa;
D[ sursa ] = 0;
InQ[ sursa ] = 1;
while (p1 != (p2+1)&(CMAX-1))
{
nod = Q[p1];
if (nod <= N)
{
for (i = N+1; i <= 2*N; i++)
if (F[nod][i] == 0 && D[i] > D[nod]+C[nod][i])
{
D[i] = D[nod]+C[nod][i];
tata[i] = nod;
if (!InQ[i])
{
InQ[i] = 1;
Q[p2] = i;
p2 = (p2+1)&(CMAX-1);
}
}
}
else
{
if (cup[nod] > 0 && (D[cup[nod]] > D[nod]-C[cup[nod]][nod]))
{
D[cup[nod]] = D[nod]-C[cup[nod]][nod];
tata[cup[nod]] = nod;
tip[cup[nod]] = 1;
if (!InQ[cup[nod]])
{
InQ[cup[nod]] = 1;
Q[p2] = cup[nod];
p2 = (p2+1)&(CMAX-1);
}
}
}
InQ[nod] = 0;
p1 = (p1+1)&(CMAX-1);
}
j = 0;
min = INF;
for (i = N+1; i <= 2*N; i++)
if (cup[i] == 0 && min > D[i]) j = i, min = D[i];
CM += min;
while (tata[j] > 0)
{
if (tip[j] == 0)
{
F[tata[j]][j]++;
cup[j] = tata[j];
}
else
F[j][tata[j]]--;
j = tata[j];
}
}
int main()
{
int i, j, f, p1, p2, nod;
freopen("cc.in", "r", stdin);
scanf("%d", &N);
for (i = 1; i <= N; i++)
for (j = 1; j <= N; j++) scanf("%d", &C[i][N+j]);
for (i = 1; i <= N; i++) flux(i);
freopen("cc.out", "w", stdout);
printf("%d\n", CM);
return 0;
}