Cod sursa(job #2685238)

Utilizator Alex_tz307Lorintz Alexandru Alex_tz307 Data 16 decembrie 2020 13:35:26
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define pi pair<int,int>

using namespace std;

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

int N, M, K;
vector<int> c, D;
vector<vector<pi>> G;
vector<vector<int>> d, dp;

void Dijkstra(int start, vector<int> &dist) {
    priority_queue<pi> Q;
    Q.emplace(0, start);
    dist.assign(N + 1, INF);
    dist[start] = 0;
    while(!Q.empty()) {
        int node = Q.top().second;
        Q.pop();
        for(pi next : G[node])
            if(dist[next.first] > dist[node] + next.second) {
                dist[next.first] = dist[node] + next.second;
                Q.emplace(-dist[next.first], next.first);
            }
    }
}

void min_self(int &a, int b) {
    a = min(a, b);
}

int main() {
    fin >> N >> M >> K;
    c.resize(K);
    for(int &x : c)
        fin >> x;
    G.resize(N + 1);
    while(M--) {
        int u, v, w;
        fin >> u >> v >> w;
        G[u].emplace_back(v, w);
        G[v].emplace_back(u, w);
    }
    Dijkstra(1, D);
    if(K == 0) {
        fout << D[N];
        return 0;
    }
    d.resize(K);
    for(int i = 0; i < K; ++i)
        Dijkstra(c[i], d[i]);
    dp.assign(1 << K, vector<int>(K, INF));
    for(int i = 0; i < K; ++i)
        dp[1 << i][i] = D[c[i]];
    for(int mask = 1; mask < (1 << K); ++mask)
        for(int i = 0; i < K; ++i)
            if(mask & (1 << i))
                for(int j = 0; j < K; ++j)
                    if(j != i && (mask & (1 << j)))
                        min_self(dp[mask][i], dp[mask ^ (1 << i)][j] + d[i][c[j]]);
    int ans = INF;
    for(int i = 0; i < K; ++i)
        min_self(ans, dp[(1 << K) - 1][i] + d[i][N]);
    fout << ans;
}