Cod sursa(job #2865621)

Utilizator UnknownPercentageBuca Mihnea-Vicentiu UnknownPercentage Data 8 martie 2022 23:17:18
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.26 kb
#include <bits/stdc++.h>
 
using namespace std;
 
inline void Open(const string Name) {
    #ifndef ONLINE_JUDGE
        (void)!freopen((Name + ".in").c_str(), "r", stdin);
        (void)!freopen((Name + ".out").c_str(), "w", stdout);
    #endif
}
 
void solve() {
    int n, m; cin >> n >> m;
    int k; cin >> k;
    vector <int> C{0};
    for(int i = 1;i <= k;i++) {
        C.emplace_back(0);
        cin >> C[i];
        --C[i];
    }
    ++k; ++k;
    C.emplace_back(n - 1);

    vector <vector <pair <int, int>>> adj(n);
    while(m--) {
        int a, b, c; cin >> a >> b >> c;
        --a, --b;
        adj[a].emplace_back(b, c);
        adj[b].emplace_back(a, c);
    }

    const int INF = 1e9;
    function <void(int, vector <int>&)> dijkstra = [&](int s, vector <int>& dist) {
       for(int i = 0;i < n;i++) {
            dist[i] = INF; 
       }

        priority_queue <pair <int, int>, vector <pair <int, int>>, greater <pair <int, int>>> q;

        q.emplace(0, s);
        dist[s] = 0;

        while(!q.empty()) {
            int d_v = q.top().first;
            int v = q.top().second;
            q.pop();

            if(d_v != dist[v]) {
                continue;
            }

            for(auto& it : adj[v]) {
                int to = it.first;
                int cost = it.second;

                if(dist[v] + cost < dist[to]) {
                    dist[to] = dist[v] + cost;
                    q.emplace(dist[to], to);
                }
            }
        }
    };

    vector <vector <int>> dist(k, vector <int>(n));
    for(int i = 0;i < k;i++) {
        dijkstra(C[i], dist[i]);
    }

    vector <vector <int>> dp(1 << k, vector <int>(k, INF));
    dp[1][0] = 0;
    for(int i = 0;i < (1 << k);i++) {
        for(int j = 0;j < k;j++) {
            if(!(i & (1 << j))) {
                continue;
            }
            for(int l = 0;l < k;l++) {
                dp[i][l] = min(dp[i][l], dp[i ^ (1 << l)][j] + dist[j][C[l]]);
            }
        }
    }

    cout << dp[(1 << k) - 1][k - 1];
}
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
 
    Open("ubuntzei");
 
    int T = 1;
    for(;T;T--) {
        solve();
    }
 
    return 0;
}