Cod sursa(job #3336605)

Utilizator GoreaRaresGorea Rares-Andrei GoreaRares Data 25 ianuarie 2026 00:09:04
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <bits/stdc++.h>
#define int long long
#define inf (long long)1e18

using namespace std;

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

struct state{
    int len, cost;
    bool operator < (const state & other) const{
        return len > other.len;
    }
};

int n, m, k, K;

signed main()
{
    fin >> n >> m >> k;
    K = k + 2;
    vector<int> p;
    p.push_back(1);
    for(int i = 1; i <= k; i++){
        int x;
        fin >> x, p.push_back(x);
    }
    p.push_back(n);
    vector<vector<pair<int, int>>> adj(n + 1);
    for(int i = 1; i <= m; i++){
        int a, b, d;
        fin >> a >> b >> d;
        adj[a].push_back({b, d});
        adj[b].push_back({a, d});
    }
    vector<vector<int>> dist(K, vector<int>(K, inf));
    auto dijkstra = [&](int src, vector<int>& d){
        priority_queue<state> pq;
        d.assign(n + 1, inf);
        d[src] = 0;
        pq.push({0, src});
        while(!pq.empty()){
            auto [cd, u] = pq.top();
            pq.pop();
            if(cd != d[u]) continue;
            for(auto [v, w] : adj[u])
                if(cd + w < d[v])
                    d[v] = cd + w, pq.push({d[v], v});
        }
    };
    for(int i = 0; i < K; i++){
        vector<int> d;
        dijkstra(p[i], d);
        for(int j = 0; j < K; j++)
            dist[i][j] = d[p[j]];
    }
    int full = (1 << k);
    vector<vector<int>> dp(full, vector<int>(K, inf));
    dp[0][0] = 0;
    for(int mask = 0; mask < full; mask++)
        for(int i = 0; i <= k; i++){
            if(dp[mask][i] == inf) continue;
            for(int j = 1; j <= k; j++)
                if(!(mask & (1 << (j - 1)))){
                    int newMask = mask | (1 << (j - 1));
                    dp[newMask][j] = min(dp[newMask][j], dp[mask][i] + dist[i][j]);
                }
        }
    int rez = inf;
    for(int i = 0; i <= k; i++)
        rez = min(rez, dp[full - 1][i] + dist[i][k + 1]);
    fout << rez;
    return 0;
}