Cod sursa(job #1756643)

Utilizator atatomirTatomir Alex atatomir Data 13 septembrie 2016 12:04:26
Problema Team Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cmath>
#include <fstream>
#include <queue>

using namespace std;

#define pb push_back
#define mp make_pair

#define maxN 504
#define maxP 53
#define inf 1000000000



int p, n, m, i, j, k, x, y, c;
vector< pair<int, int> > list[maxN];
int dp[maxP][maxP][maxN];
int dist[maxN][maxN];
int dest[maxN];
priority_queue< pair<int, int> > H;


void dijk(int root) {
    int i;

    for (i = 1; i <= n; i++) dist[root][i] = inf;
    dist[root][root] = 0;
    H.push(mp(-0, root));

    while (!H.empty()) {
        int node = H.top().second;
        int cost = -H.top().first;
        H.pop();

        if (dist[root][node] != cost) continue;

        for (i = 0; i < list[node].size(); i++) {
            int to = list[node][i].first;
            int cc = list[node][i].second;

            if (dist[root][to] <= dist[root][node] + cc) continue;
            dist[root][to] = dist[root][node] + cc;
            H.push(mp(-dist[root][to], to));
        }
    }
}

int compute(int l, int r, int node) {
    if (l > r) return 0;
    if (dp[l][r][node] != inf) return dp[l][r][node];

    for (int i = l; i <= r; i++)
        dp[l][r][node] = min(dp[l][r][node], compute(l, i - 1, dest[i]) + compute(i + 1, r, dest[i]) + dist[dest[i]][node]);

    return dp[l][r][node];
}


int main()
{
    freopen("team.in", "r", stdin);
    freopen("team.out", "w", stdout);

    scanf("%d%d%d", &p, &n, &m);
    for (i = 1; i <= m; i++) {
        scanf("%d%d%d", &x, &y, &c);
        list[x].pb(mp(y, c));
        list[y].pb(mp(x, c));
    }

    for (i = 1; i <= p; i++)
        for (j = 1; j <= p; j++)
            for (k = 1; k <= n; k++)
                dp[i][j][k] = inf;

    for (i = 1; i <= p; i++) {
        scanf("%d", &dest[i]);
        dijk(dest[i]);
        dp[i][i][dest[i]] = 0;
    }

    printf("%d", compute(1, p, 1));




    return 0;
}