Cod sursa(job #11773)

Utilizator vlad_popaVlad Popa vlad_popa Data 1 februarie 2007 17:16:29
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
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;
}