Cod sursa(job #2102474)

Utilizator mariusn01Marius Nicoli mariusn01 Data 8 ianuarie 2018 21:26:13
Problema Team Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.44 kb
#include <fstream>
#include <vector>
#define INF 2000000000
#define DIMP 52
#define DIM 502

using namespace std;

int DJ[DIMP][DIM];
int D[DIMP][DIMP][DIMP];
int v[DIMP], u[DIM];
vector < pair<int, int> > L[DIM];

int n, m, p, x, y, c, k, poz;
int calcul(int k, int i, int j) {
    if (i > j)
        return 0;

    if (D[k][i][j] != INF)
        return D[k][i][j];

    for (int t = i; t<=j; t++) {
        /// plec din punctul de destinatie al persoanei k si duc la
        /// destinatie persoana t apoi pe celelalte
        D[k][i][j] = min(D[k][i][j], DJ[k][v[t]] +
                         calcul( t, i, t-1 )
                         + calcul(t, t+1, j));
    }
    return D[k][i][j];
}

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

    fin>>p>>n>>m;
    for (int i=1;i<=m;i++) {
        fin>>x>>y>>c;
        L[x].push_back(make_pair(y, c));
        L[y].push_back(make_pair(x, c));
    }
    v[1] = 1;
    k = 1;
    for (int i=1;i<=p;i++) {
        fin>>x;
        if (x != v[k]) {
            v[++k] = x;
        }
    }

    p = k;

    for (k=1;k<=p;k++) {
        /// distanta minima de la v[i] la toate celelalte noduri

        for (int i=1;i<=n;i++) {
            DJ[k][i] = INF;
            u[i] = 0;
        }
        DJ[k][ v[k] ] = 0;

        for (int i=1;i<=n;i++) {
            int minim = INF;
            for (int j=1;j<=n;j++)
                if (u[j] == 0 && DJ[k][j] < minim) {
                    minim = DJ[k][j];
                    poz = j;
                }
            u[poz] = 1;
            if (minim != INF) {
                for (int j=0;j<L[poz].size();j++) {
                    int vecin = L[poz][j].first;
                    int cost  = L[poz][j].second;
                    if (DJ[k][vecin] > DJ[k][poz] + cost)
                        DJ[k][vecin] = DJ[k][poz] + cost;
                }
            }
        }
    }

    ///DJ[i][j] = distanta minima de la destinatia persoanei i la nodul j

    for (k=1;k<=p;k++)
        for (int i=1;i<=p;i++)
            for (int j=i;j<=p;j++)
                D[k][i][j] = INF;
    for (int i=1;i<=p;i++)
        D[i][i][i] = 0;

    fout<<calcul(1, 1, p)<<"\n";
/*
    for (int i=1;i<=p;i++) {
        for (int j=1;j<=p;j++) {
            for (k=1;k<=p;k++)
                fout<<D[i][j][k]<<" ";
            fout<<"\n";
        }
        fout<<"\n";


    }
*/
    return 0;
}