Cod sursa(job #5163)

Utilizator vlad_popaVlad Popa vlad_popa Data 10 ianuarie 2007 20:24:05
Problema Cc Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <stdio.h>

#define FIN "cc.in"
#define FOUT "cc.out"
#define nmax 121

int a[nmax][nmax], d[nmax], v[nmax], s, k, n,
          i, j, io, lio, co, R, u, jo, uo, c;

void calcul ()
{
  d[1] = 1;
  v[1] = 1;
  s = a[1][1];
  for (k = 2; k <= n; k++)
   {
     lio = a[1][k] + a[k][d[1]] - a[1][d[1]];
     io = 1;
     co = d[io];
     j = d[io];
     for (i = 1; i < k; i++)
      {
        j = d[i];
        R = a[i][k] + a[k][j] - a[i][j];
        if (R < lio)
         {
           lio = R;
           io = i;
           j = d[i];
           co = j;
           jo = j;
         }
        for (c = 1; c < k; c++)
          if (c - j)
           {
             u = v[c];
             R = a[i][k] + a[k][c] - a[i][j] - a[u][c] + a[u][j];
             if (R < lio)
              {
                lio = R;
                co = c;
                io = i;
                uo = u;
                jo = j;
              }
           }
      }
     if (lio >= a[k][k])
      {
        s += a[k][k];
        d[k] = k;
        v[k] = k;
      }
     else
      {
        s += lio;
        if (co == jo)
         {
           d[io] = k;
           d[k] = co;
           v[co] = io;
           v[k] = io;
         }
        else
         {
           d[io] = k;
           v[k] = io;
           d[uo] = jo;
           v[jo] = uo;
           d[k] = co;
           v[co] = k;
         }
      }
   }
  printf ("%d\n", s);
}

int
 main ()
{
  freopen (FIN, "rt", stdin);
  freopen (FOUT, "wt", stdout);

  scanf ("%d", &n);
  for (i = 1; i <= n; i++)
   { scanf ("\n");
     for (j = 1; j <= n; j++)
       scanf ("%d ", &a[i][j]);
   }
  calcul();
//  printf ("%d\n", s);
  //for (i = 1; i <= n; i++)
   // printf ("%d ", d[i]);
  return 0;
}