Cod sursa(job #1154075)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 25 martie 2014 22:31:56
Problema Team Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

const int oo = 0x3f3f3f3f;

int N, V, Source, Answer;
vector<int> Destinations;
vector< vector<int> > Cost;

void RoyFloyd() {
    for (int k = 0; k < V; ++k)
        for (int i = 0; i < V; ++i)
            for (int j = 0; j < V; ++j)
                Cost[i][j] = min(Cost[i][j], Cost[i][k] + Cost[k][j]);
}

void Solve() {
    RoyFloyd();
    vector< vector< vector<int> > > dp = vector< vector< vector<int> > >(V, vector< vector<int> >(N, vector<int>(N, oo)));
    for (int length = 1; length <= N; ++length) {
        for (int x = 0; x < V; ++x) {
            for (int first = 0, last = length - 1; last < N; ++first, ++last) {
                for (int split = first; split <= last; ++split) {
                    int current = Cost[x][Destinations[split]];
                    if (split > first)
                        current += dp[Destinations[split]][first][split - 1];
                    if (split < last)
                        current += dp[Destinations[split]][split + 1][last];
                    dp[x][first][last] = min(dp[x][first][last], current);
                }
            }
        }
    }
    Answer = dp[Source][0][N - 1];
}

void Read() {
    ifstream in("team.in");
    int E;
    in >> N >> V >> E;
    Cost = vector< vector<int> >(V, vector<int>(V, oo));
    for (; E > 0; --E) {
        int x, y, c;
        in >> x >> y >> c;
        --x;
        --y;
        Cost[x][y] = Cost[y][x] = min(Cost[x][y], c);
    }
    for (int x = 0; x < V; ++x)
        Cost[x][x] = 0;
    Destinations = vector<int>(N);
    for (int x = 0; x < N; ++x) {
        in >> Destinations[x];
        --Destinations[x];
    }
    Source = 0;
    in.close();
}

void Print() {
    ofstream out("team.out");
    out << Answer << "\n";
    out.close();
}

int main() {
    Read();
    Solve();
    Print();
    return 0;
}