Cod sursa(job #940437)

Utilizator rudarelLup Ionut rudarel Data 16 aprilie 2013 11:23:30
Problema Team Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <stdio.h>
 
#define MAX_P 64
#define MAX_N 512
#define FIN "team.in"
#define FOUT "team.out"
#define INF 1000000666
#define FOR(i, a, b) for (i = (a); i < (b); i++)
 
int N, M, P, G[MAX_N][MAX_N], C[MAX_P][MAX_N], D[MAX_P];
int bst[MAX_P][MAX_P][MAX_N];
 
void dijkstra(int src, int dist[])
{
    int i, min, pos;
    char U[MAX_N];
     
    FOR (i, 0, N) { dist[i] = INF; U[i] = 0; }
    dist[src] = 0;
 
    while (1)
    {
        min = INF; pos = -1;
        FOR (i, 0, N) if (!U[i] && min > dist[i])
            min = dist[i], pos = i;
 
        if (pos == -1) break;
        U[pos] = 1;
 
        FOR (i, 0, N) if (dist[i] > dist[pos]+G[pos][i])
            dist[i] = dist[pos]+G[pos][i];
    }
}
 
int solve(int l, int r, int s)
{
    int m, t, &ret = bst[l][r][s];
     
    if (l > r) return 0;
    if (l == r) return C[l][s];
    if (ret != -1) return ret;
 
    ret = INF;
    FOR (m, l, r+1)
    {
        t = C[m][s] + solve(l, m-1, D[m]) + solve(m+1, r, D[m]);
        if (ret > t) ret = t;
    }
    return ret;
}
 
int main(void)
{
    int i, j, k, c;
     
    freopen(FIN,"r", stdin);
    freopen(FOUT, "w", stdout);
 
    scanf("%d %d %d", &P, &N, &M);
    FOR (i, 0, N) FOR (j, 0, N) G[i][j] = (i != j)*INF;
    for (; M > 0; M--)
    {
        scanf("%d %d %d", &i, &j, &c);
        i--; j--;
        G[i][j] = G[j][i] = c;
    }
    FOR (i, 0, P)
    {
        scanf("%d", D+i); D[i]--;
        dijkstra(D[i], C[i]);
    }
 
    FOR (i, 0, P) FOR (j, i, P) FOR (k, 0, N) bst[i][j][k] = -1;
     
    printf("%d\n", solve(0, P-1, 0));
     
    return 0;
}