Cod sursa(job #1958859)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 8 aprilie 2017 20:22:16
Problema Team Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <fstream>

//19:49
using namespace std;

const int NMAX = 500 + 5;
const int PMAX = 50 + 5;
const int INF = 1E9 + 15;

int P, N, M;
int cost[NMAX][NMAX];
int dest[PMAX];

bool vis[NMAX];
void dijkstra(int node, int dist[]) {
    for (int i = 1; i <= N; ++ i) {
        vis[i] = false;
        dist[i] = INF;
    }

    dist[node] = 0;
    for (int i = 1; i <= N; ++ i) {
        int best = INF;
        int who = -1;
        for (int j = 1; j <= N; ++ j)
            if (!vis[j] && dist[j] < best)
                best = dist[j], who = j;

        vis[who] = true;
        for (int j = 1; j <= N; ++ j)
            if (dist[who] + cost[who][j] < dist[j])
                dist[j] = dist[who] + cost[who][j];
    }
}

int dist[PMAX][NMAX];
int dp[PMAX][PMAX][PMAX];

int main()
{
    ifstream cin("team.in");
    ofstream cout("team.out");

    cin >> P >> N >> M;
    for (int i = 1; i <= N; ++ i) {
        for (int j = 1; j <= N; ++ j)
            cost[i][j] = INF;
        cost[i][i] = 0;
    }

    for (int i = 1; i <= M; ++ i) {
        int a, b, c;
        cin >> a >> b >> c;
        if (c < cost[a][b])
            cost[a][b] = cost[b][a] = c;
    }

    dest[0] = 1;
    for (int i = 1; i <= P; ++ i)
        cin >> dest[i];

    for (int i = 0; i <= P; ++ i)
        dijkstra(dest[i], dist[i]);

    for (int l = P; l; -- l)
        for (int r = l; r <= P; ++ r)
            for (int node = 0; node <= P; ++ node) {
                dp[l][r][node] = INF;
                for (int inter = l; inter <= r; ++ inter) {
                    int aux = dp[l][inter - 1][inter] + dp[inter + 1][r][inter] + dist[node][dest[inter]];
                    if (aux < dp[l][r][node])
                        dp[l][r][node] = aux;
                }
            }
    cout << dp[1][P][0] << '\n';
    return 0;
}