Pagini recente » Cod sursa (job #101463) | Cod sursa (job #145954) | Cod sursa (job #2874410) | Cod sursa (job #2855417) | Cod sursa (job #5191)
Cod sursa(job #5191)
#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, i0, li0, c0, R, u, jo, u0, c;
void calcul ()
{
d[1] = 1;
v[1] = 1;
s = a[1][1];
for (k = 2; k <= n; k++)
{
li0 = a[1][k] + a[k][d[1]] - a[1][d[1]];
i0 = 1;
c0 = d[i0];
j = d[i0];
for (i = 1; i < k; i++)
{
j = d[i];
R = a[i][k] + a[k][j] - a[i][j];
if (R < li0)
{
li0 = R;
i0 = i;
j = d[i];
c0 = 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 < li0)
{
li0 = R;
c0 = c;
i0 = i;
u0 = u;
jo = j;
}
}
}
if (li0 >= a[k][k])
{
s += a[k][k];
d[k] = k;
v[k] = k;
}
else
{
s += li0;
if (c0 == jo)
{
d[i0] = k;
d[k] = c0;
v[c0] = i0;
v[k] = i0;
}
else
{
d[i0] = k;
v[k] = i0;
d[u0] = jo;
v[jo] = u0;
d[k] = c0;
v[c0] = k;
}
}
}
}
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;
}