Cod sursa(job #43856)

Utilizator victorsbVictor Rusu victorsb Data 30 martie 2007 16:34:10
Problema Team Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <cstdio>
#include <string.h>

#define Nmax 512
#define Pmax 64
#define INF 0x3f3f3f3f

int n, m, p;
int cost[Nmax][Nmax], mat[Nmax][Pmax], home[Pmax], dist[Nmax], g[Nmax], d[Pmax][Pmax][Nmax];

void citire()
{
    int i, a, b, c;
    
    memset(cost, 0x3f, sizeof(cost));
    
    scanf("%d", &p);
    scanf("%d", &n);
    scanf("%d", &m);
    for (i = 1; i <= m; ++i)
    {
        scanf("%d %d %d", &a, &b, &c);
        cost[a][b] = cost[b][a] = c;
    }
    for (i = 1; i <= p; ++i)
        scanf("%d", &home[i]);
}

void dijkstra(int s)
{
    int i, j, best, ct, nod;

    memset(dist, 0x3f, sizeof(dist));
    dist[s] = 0;
    
    ct = n;
    for (i = 1; i <= n; ++i)
        g[i] = i;
    
    for (i = 1; i <= n; ++i)
    {
        best = 1;
        for (j = 1; j <= ct; ++j)
            if (dist[g[j]] < dist[g[best]])
                best = j;
        
        nod = g[best];
        g[best] = g[ct--];
        
        for (j = 1; j <= n; ++j)
            if (dist[nod] + cost[nod][j] < dist[j])
                dist[j] = dist[nod] + cost[nod][j];
    }
}

void solve()
{
    int i, j, nod, k, dif;
    
    for (i = 1; i <= p; ++i)
    {
        dijkstra(home[i]);
        for (j = 1; j <= n; ++j)
            mat[j][i] = dist[j];
    }
    
    for (dif = 0; dif < n; ++dif)
        for (i = 1; i + dif <= n; ++i)
        {
            j = i + dif;
            for (nod = 1; nod <= n; ++nod)
            {
                d[i][j][nod] = INF;
                for (k = i; k <= j; ++k)
                    if (mat[nod][k] + d[i][k - 1][home[k]] + d[k + 1][j][home[k]] < d[i][j][nod])
                        d[i][j][nod] = mat[nod][k] + d[i][k - 1][home[k]] + d[k + 1][j][home[k]];
            }
        }
    
    printf("%d\n", d[1][p][1]);
}

int main()
{
    freopen("team.in", "r", stdin);
    freopen("team.out", "w", stdout);
    citire();
    solve();
    return 0;
}