Cod sursa(job #110358)

Utilizator fireatmyselfBogdan-Alexandru Stoica fireatmyself Data 26 noiembrie 2007 15:27:21
Problema Team Scor 5
Compilator c Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <stdio.h>
#define NMAX (1<<9)
#define PMAX (1<<6)
#define INF 666000666

#define MIN(a,b) (((a)<(b))?(a):(b))

int DP[PMAX][PMAX];
int Dist[NMAX][NMAX], A[NMAX][NMAX], N, M, P, Dest[PMAX];

void init()
{
        int i, j;

        for (i = 1; i < NMAX; i++)
            for (j = 0; j < NMAX; j++) A[i][j] = INF;

        for (i = 1; i <= NMAX; i++) A[i][i] = 0;

        for (i = 0; i < PMAX; i++)
            for (j = 0; j < PMAX; j++) DP[i][j] = INF;
}

void read()
{
        int i, j, k, d;

        freopen("team.in", "r", stdin);
        scanf("%d%d%d", &P, &N, &M);

        for (k = 0; k < M; k++)
        {
                scanf("%d%d%d", &i, &j, &d);
                A[i][j] = A[j][i] = d;
        }

        for (i = 1; i <= P; i++) scanf("%d", Dest+i);
}

void bf()
{
        int i, j, k;

        for (k = 1; k <= N; k++)
            for (i = 1; i <= N; i++)
                for (j = i+1; j <= N; j++)
                    if (A[i][j]>(A[i][k]+A[k][j])) {
                       A[j][i] = A[i][j] = A[i][k]+A[k][j];
                       }

        for (i = 1; i <= N; i++) A[0][i] = A[1][i];
}

int solve(int last, int i, int j)
{
        int k, cost;

        if (i>j) return 0;

        if (DP[i][j]<INF) return DP[i][j];

        if (i==j&&last==j) return 0;

        DP[i][j] = INF;

        for (k = i; k <= j; k++)
        {
            cost = A[ Dest[last] ][ Dest[k] ]+solve(k,i,k-1)+solve(k,k+1,j);
            DP[i][j] = MIN(DP[i][j], cost);
        }

        return DP[i][j];
}

void write()
{
        int res = solve(0,1,P);
        freopen("team.out", "w", stdout);
        printf("%d\n", res);
}

int main()
{
        init();
        read();
        bf();
        write();
        return 0;
}