Cod sursa(job #1435)

Utilizator filipbFilip Cristian Buruiana filipb Data 13 decembrie 2006 17:30:41
Problema Cc Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <stdio.h>

int N, M[124][124], v[124], d[124], S[124];

int main(void)
{
    int i, j, k, S1, SMIN, i1, i2, tp, si, sj;
    
    freopen("cc.in", "r", stdin);
    freopen("cc.out", "w", stdout);
    
    scanf("%d", &N);
    for (i = 1; i <= N; i++)
        for (j = 1; j <= N; j++)
            scanf("%d", &M[i][j]);
            
    S[1] = M[1][1]; d[1] = 1; v[1] = 1;
    for (k = 2; k <= N; k++)
    {
        SMIN = S[k-1] + M[k][k]; tp = 0;
        
        for (i = 1; i < k; i++)
            if (SMIN > S[k-1] - M[i][d[i]] + M[i][k] + M[k][d[i]])
               SMIN = S[k-1] - M[i][d[i]] + M[i][k] + M[k][d[i]],
               tp = 1, si = i;
       
        for (i = 1; i < k; i++)
            for (j = 1; j < k; j++)
                if (d[i] != j)
                {
                   S1 = S[k-1] - M[i][d[i]] - M[v[j]][j] + M[i][k] + M[k][j] + 
                        M[v[j]][d[i]];
                   if (SMIN > S1)
                      SMIN = S1, tp = 2, si = i, sj = j;                      
                }
       
        S[k] = SMIN;
        if (tp == 0)
             d[k] = k, v[k] = k;
        else if (tp == 1)
             i = si, i1 = d[i],
             d[k] = i1, d[i] = k,
             v[i1] = k, v[k] = i;
        else if (tp == 2)
             i = si, j = sj,
             i1 = v[j], i2 = d[i],
             d[i1] = i2, d[i] = k, d[k] = j,
             v[i2] = i1, v[k] = i, v[j] = k;

    }
              
    printf("%d\n", S[N]);
    
    return 0;
}