Cod sursa(job #3308955)

Utilizator pkseVlad Bondoc pkse Data 30 august 2025 14:09:58
Problema Ubuntzei Scor 55
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.5 kb
/*

    before u copy my code
    go to twitch.tv/bigbigmongey
    and ask if he is a femboy

*/
#include <bits/stdc++.h>
// #define int long long 
#define fi first 
#define se second 
using namespace std;

struct minheap {
    int v;
    int node;
    bool operator<(const minheap &a) const {
        return v > a.v;
    }
};

void dijkstra(int st, vector<int> &ans, vector<vector<pair<int, int>>> &a) {
    priority_queue<minheap> pq;
    pq.push({0, st});
    while(!pq.empty()) {
        int v = pq.top().v;
        int node = pq.top().node;
        pq.pop();

        if(ans[node] != 1e9)
            continue;
        ans[node] = v;

        for(auto i : a[node]) {
            pq.push({v + i.se, i.fi});
        }
    }
}

signed main() {
    freopen("ubuntzei.in", "r", stdin);
    freopen("ubuntzei.out", "w", stdout);

    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int n, m; cin >> n >> m;
    
    vector<int> frien;

    int k; cin >> k;
    for(int i = 0; i < k; i ++) {
        int x; cin >> x;
        frien.push_back(x);
    }

    vector<vector<pair<int, int>>> a(n + 1);

    for(int i = 0; i < m; i ++) {
        int x, y, z; cin >> x >> y >> z;
        a[x].push_back({y, z});
        a[y].push_back({x, z});
    }

    vector<int> bfs1(n + 1, 1e9);
    dijkstra(1, bfs1, a);

    //               value  start    mask                             last
    vector<vector<int>> dp((1 << k), vector<int>(n + 1, 1e9));
    vector<vector<int>> scared(k, vector<int>(k + 1, 1e9));

    frien.push_back(n);

    for(int i = 0; i < k; i ++) {
        vector<int> tempbfs(n + 1, 1e9);
        dijkstra(frien[i], tempbfs, a);
        for(int j = 0; j <= k; j ++) {
            if(i == j)
                continue;
            scared[i][j] = tempbfs[frien[j]];
        }
        dp[(1 << i)][i] = bfs1[frien[i]];
    }

    for(int mask = 1; mask < (1 << k); mask ++) {
        for(int i = 0; i < k; i ++) {
            if((mask & (1 << i)) == 0)
                continue;
            for(int j = 0; j < k; j ++) {
                if((mask & (1 << j)) != 0)
                    continue;
                if(dp[mask ^ (1 << j)][j] > dp[mask][i] + scared[i][j]) {
                    dp[mask ^ (1 << j)][j] = dp[mask][i] + scared[i][j];
                }
            }
        }
    }

    int ans = 1e9;

    for(int i = 0; i < k; i ++) {
        ans = min(dp[(1 << k) - 1][i] + scared[i][k], ans);
    }

    cout << ans;
}