Cod sursa(job #1780615)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 16 octombrie 2016 14:15:59
Problema Team Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <algorithm>

using namespace std;

ifstream fin("team.in");
ofstream fout("team.out");

const int dimn = 505;
const int dimp = 55;
const int inf = 0x3f3f3f3f;

int p, n, m;
int edgeCost[dimn][dimn], d[dimp], cost[dimp][dimp];
int dp[dimp][dimp][dimp];

int dist[dimn], ok[dimn];
void Dijkstra(int source) {

    memset(dist, inf, sizeof dist);
    memset(ok, false, sizeof ok);
    dist[source] = 0;

    for (int i = 1; i <= n; ++i) {

        int node = 0;
        for (int j = 1; j <= n; ++j)
            if (!ok[j] && dist[node] > dist[j])
                node = j;

        ok[node] = true;
        for (int j = 1; j <= n; ++j)
            if (!ok[j] && dist[node] + edgeCost[node][j] < dist[j])
                dist[j] = dist[node] + edgeCost[node][j];

    }

}

int Solve(int begin, int end, int from) {

    if (begin > end || (begin == end && begin == from))
        return 0;

    if (dp[begin][end][from] != inf)
        return dp[begin][end][from];

    for (int split = begin; split <= end; ++split)
        dp[begin][end][from] = min(dp[begin][end][from],
                                   Solve(begin, split - 1, split) + Solve(split + 1, end, split) + cost[from][split]);

    return dp[begin][end][from];

}

int main() {

    fin >> p >> n >> m;

    memset(edgeCost, inf, sizeof edgeCost);
    for (int i = 1; i <= m; ++i) {
        int x, y, c;
        fin >> x >> y >> c;
        edgeCost[x][y] = edgeCost[y][x] = c;
    }

    d[0] = 1;
    for (int i = 1; i <= p; ++i)
        fin >> d[i];

    memset(cost, inf, sizeof cost);
    for (int i = 0; i <= p; ++i) {
        Dijkstra(d[i]);
        for (int j = 0; j <= p; ++j)
            cost[i][j] = dist[d[j]];
    }

    memset(dp, inf, sizeof dp);

    fout << Solve(1, p, 0) << '\n';

    return 0;

}

//Trust me, I'm the Doctor!