Cod sursa(job #182421)

Utilizator raula_sanChis Raoul raula_san Data 20 aprilie 2008 21:17:48
Problema Team Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <cstdio>
#include <cstring>

#define INFI 0x3f3f3f3f
#define MAXN 512
#define MAXP 64

int P, N, M;
int G[MAXN], H[MAXN], Dist[MAXN], D[MAXN][MAXN], C[MAXN][MAXN], MIN[MAXP][MAXP][MAXN];

void Dijkstra(int s)
{
    memset(Dist, 0x3f, sizeof(Dist));
    Dist[s] = 0;
    
    int i, j, k, nod, best;
    
    for(i=1; i<=N; ++i)
        G[i] = i;
    
    k = N;
    for(i=1; i<=N; ++i) {
        best = 1;
            
        for(j=1; j<=k; ++j)
            if(Dist[G[j]] < Dist[G[best]])
                best = j;
               
        nod = G[best];
        G[best] = G[k--];
        
        for(j=1; j<=N; ++j)
            if(Dist[j] > Dist[nod] + C[nod][j])
                Dist[j] = Dist[nod] + C[nod][j];
    }
}

int main()
{
    freopen("team.in", "rt", stdin);
    freopen("team.out", "wt", stdout);
    
    memset(C, 0x3f, sizeof(C));
    
    scanf("%d", &P);
    scanf("%d", &N);
    scanf("%d", &M);
    
    int i, j, k, d, nod, x, y, z;
    
    for(i=1; i<=M; ++i) {
        scanf("%d %d %d", &x, &y, &z);
        
        C[x][y] = z;
        C[y][x] = z;
    }
    
    for(i=1; i<=P; ++i) {
        scanf("%d", &H[i]);

        Dijkstra(H[i]);
        
        for(j=1; j<=N; ++j)
            D[i][j] = Dist[j];
    }

    for(d=0; d<P; ++d)
        for(i=1; i+d<=P; ++i) {
            j = i + d;
            
            for(nod=1; nod<=N; ++nod) {
                MIN[i][j][nod] = INFI;
                
                for(k=i; k<=j; ++k)
                    if(MIN[i][j][nod] > MIN[i][k-1][H[k]] + MIN[k+1][j][H[k]] + D[k][nod])
                        MIN[i][j][nod] = MIN[i][k-1][H[k]] + MIN[k+1][j][H[k]] + D[k][nod];
            }
        }

    printf("%d", MIN[1][P][1]);

    fclose(stdin);
    fclose(stdout);
    
    return 0;
}