Pagini recente » Cod sursa (job #853355) | Cod sursa (job #1623411) | Cod sursa (job #2731500) | Cod sursa (job #3276894) | Cod sursa (job #686515)
Cod sursa(job #686515)
using namespace std;
#include <cstdio>
#define FIN "cc.in"
#define FOUT "cc.out"
#define NMAX 301
#define INF 0x3f3f3f3f
int f[NMAX][NMAX], c[NMAX][NMAX], a[NMAX][NMAX], n, m;
int pred[NMAX], begin, end, coada[NMAX*NMAX], d[NMAX], s, t;
void in (int x)
{
coada[end] = x;
end++;
}
int out ()
{
int temp = coada[begin];
begin++;
return temp;
}
void bellm_ford(int s)
{
int i, j;
for (i = 1; i <= n; i++)
if (i != s)
d[i] = INF;
begin = end = 0;
in(s);
while (begin != end)
{
i = out ();
for (j = 1; j <= n; j++)
if (d[j] > d[i] + a[i][j] && c[i][j] > f[i][j])
{
d[j] = d[i] + a[i][j];
pred[j] = i;
in(j);
}
}
}
void ford_fulk ()
{
int i;
do
{
int min = INF;
bellm_ford(s);
if (d[t] >= INF)
break;
i = t;
while (pred[i])
{
if (min > c[pred[i]][i] - f[pred[i]][i])
min = c[pred[i]][i] - f[pred[i]][i];
i = pred[i];
}
i = t;
while (pred[i])
{
f[pred[i]][i] += min;
f[i][pred[i]] -= min;
a[i][pred[i]] = -a[pred[i]][i];
i = pred[i];
}
}
while (d[t]);
}
int
main ()
{
int cap, i, j, sol = 0;
freopen (FIN, "rt", stdin);
freopen (FOUT, "wt", stdout);
scanf ("%d", &n);
for (i = 1; i <= 2*n + 2; i++)
for (j = 1; j <= 2*n + 2; j++)
a[i][j] = INF;
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
{
scanf ("%d", &cap);
a[i+1][j+n+1] = cap;
c[i+1][j+n+1] = 1;
}
for (i = 1; i <= n; i++)
{
c[1][i+1] = 1;
a[1][i+1] = 0;
c[n+i+1][2*n+2] = 1;
a[n+i+1][2*n+2] = 0;
}
n = 2 * n + 2;
s = 1;
t = n;
ford_fulk();
/*for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
if (f[i][j])
printf ("%d %d -> muchie: %d flux: %d\n", i, j, a[i][j], f[i][j]);
*/
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
if (f[i][j] > 0)
sol += a[i][j];
printf ("%d\n", sol);
return 0;
}