Cod sursa(job #1021148)

Utilizator deneoAdrian Craciun deneo Data 3 noiembrie 2013 12:51:44
Problema Team Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;

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

const int MAXP = 60;
const int MAXN = 510;
const int inf = 1 << 30;

int p, n, m;
int d[MAXP], dist[MAXP][MAXP], sol[MAXP][MAXP][MAXP];
vector < pair <int, int> > graf[MAXN];

void dijkstra(int nodStart, int v[]) {
    int used[MAXN]; fill(used, used + MAXN, 0);

    v[nodStart] = 0;

    for (int i = 1; i < n; ++i) {
        int nodMin = inf, poz;

        for (int j = 1; j <= n; ++j)
            if (!used[j] && v[j] < nodMin) {
                nodMin = v[j];
                poz = j;
            }

        used[poz] = 1;

        for (auto it = graf[poz].begin(); it != graf[poz].end(); ++it)
            if (v[(*it).first] > v[poz] + (*it).second)
                v[(*it).first] = v[poz] + (*it).second;

    }
}
int main() {
    fin >> p >> n >> m;

    for (int i = 1; i <= m; ++i) {
        int x, y, c;
        fin >> x >> y >> c;
        graf[x].push_back(make_pair(y, c));
        graf[y].push_back(make_pair(x, c));
    }

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

    d[p + 1] = 1;

    for (int i = 1; i <= p + 1; ++i) {
        int v[MAXN]; fill(v, v + MAXN, inf);
        dijkstra(d[i], v);
        for (int j = 1; j <= p; ++j)
            dist[i][j] = v[d[j]];
    }

    for (int i = 0; i < p; ++i)
        for (int st = 1; st <= p; ++st)
            for (int nod = st; nod <= st + i; ++nod) {
                int rez1 = inf, rez2 = inf;

                if (nod > st)
                    for (int k = st; k < nod; ++k)
                        rez1 = min (rez1, sol[k][st][(nod - st) - 1] + dist[nod][k]);

                if (nod < st + i)
                    for (int k = nod + 1; k <= st + i; ++k)
                        rez2 = min (rez2, sol[k][nod + 1][(st + i - nod) - 1] + dist[nod][k]);

                if (rez1 == inf) rez1 = 0;
                if (rez2 == inf) rez2 = 0;

                sol[nod][st][i] = rez1 + rez2;
            }

    int rez = inf;

    for (int i = 1; i <= p; ++i)
        rez = min (rez, sol[i][1][p - 1] + dist[p + 1][i]);

    fout << rez;

    return 0;
}