Cod sursa(job #3361732)

Utilizator Radu_BicliBiclineru Radu Radu_Bicli Data 28 iulie 2026 10:38:39
Problema Team Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.39 kb
#include <bits/stdc++.h>

using namespace std;

#define USE_STD_IO 0
#if USE_STD_IO
    #define fin cin
    #define fout cout
#else
    ifstream fin("team.in");
    ofstream fout("team.out");
#endif

const int INF = 1e9 + 7;
struct Muchie {
    int vec, cost;
};

vector<Muchie> gr[1002];
int p, n, m, i, j, k, dist[1002], v[1002];
int d[52][52][1002];
int drum[52][52];
bool viz[1002];

static inline void Dijkstra(int start) {
    priority_queue<
        array<int, 2>,
        vector<array<int, 2>>,
        greater<array<int, 2>>> q;

    memset(viz + 1, false, n * sizeof(bool));
    for(int i = 1; i <= n; i++) dist[i] = INF;

    dist[start] = 0;
    q.push({0, start});

    int nod, cst;
    while(!q.empty()) {
        nod = q.top()[1];
        cst = q.top()[0];
        q.pop();

        if(cst > dist[nod]) continue;
        if(viz[nod]) continue;

        viz[nod] = true;

        for(Muchie mch : gr[nod]) {
            if(!viz[mch.vec] && mch.cost + dist[nod] < dist[mch.vec]) {
                dist[mch.vec] = mch.cost + dist[nod];
                q.push({dist[mch.vec], mch.vec});
            }
        }
    }
}

int main() {
    #if USE_STD_IO
        ios_base::sync_with_stdio(false);
    #endif
    fin.tie(NULL);
    fout.tie(NULL);

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

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

    for(i = 0; i <= p; i++) {
        Dijkstra(v[i]);
        for(j = 0; j <= p; j++) {
            drum[i][j] = dist[v[j]];
        }
    }

    for(i = 1; i <= p; i++) {
        for(j = i; j <= p; j++) {
            for(k = 0; k <= p; k++) {
                d[i][j][k] = INF;
            }
            //memset(d[i][j], -1, (1 + p) * sizeof(int));
        }
    }

    for(int lg = 1; lg <= p; lg++) {
        for(j = lg; j <= p; j++) {
            i = j - lg + 1;

            for(k = i; k <= j; k++) {
                for(int kk = 0; kk <= p; kk++) {
                    int mi = drum[kk][k];
                    if(i < k) mi += d[i][k - 1][k];
                    if(k < j) mi += d[k + 1][j][k];
                    if(mi < d[i][j][kk]) d[i][j][kk] = mi;
                }
            }
        }
    }

    fout << d[1][p][0];

    return 0;
}