Cod sursa(job #5279)

Utilizator vlad_popaVlad Popa vlad_popa Data 11 ianuarie 2007 14:33:58
Problema Cc Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <stdio.h>

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

int a[nmax][nmax], d[nmax], v[nmax], s, k, n,
          i, j, i2, li2, c2, R, u, j2, u2, c;

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]);
   }
  if (n == 0)
    while (!d[1]);
  for (i = 1; i <= n; i++)
    for (j = 1; j <= n; j++)
      if (a[i][j] == 0)
        while (!d[1]);
  d[1] = 1;
  v[1] = 1;
  s = a[1][1];
  for (k = 2; k <= n; k++)
   {
     li2 = a[1][k] + a[k][d[1]] - a[1][d[1]];
     i2 = 1;
     c2 = d[i2];
     j = d[i2];
     for (i = 1; i < k; i++)
      {
        j = d[i];
        R = a[i][k] + a[k][j] - a[i][j];
        if (R < li2)
         {
           li2 = R;
           i2 = i;
           j = d[i];
           c2 = j;
           j2 = 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 < li2)
              {
                li2 = R;
                c2 = c;
                i2 = i;
                u2 = u;
                j2 = j;
              }
           }
      }
     if (li2 >= a[k][k])
      {
        s += a[k][k];
        d[k] = k;
        v[k] = k;
      }
     else
      {
        s += li2;
        if (c2 == j2)
         {
           d[i2] = k;
           d[k] = c2;
           v[c2] = i2;
           v[k] = i2;
         }
        else
         {
           d[i2] = k;
           v[k] = i2;
           d[u2] = j2;
           v[j2] = u2;
           d[k] = c2;
           v[c2] = k;
         }
      }
   } 
  printf ("%d\n", s);
  //for (i = 1; i <= n; i++)
   // printf ("%d ", d[i]);
  return 0;
}