Cod sursa(job #2845183)

Utilizator DordeDorde Matei Dorde Data 7 februarie 2022 16:45:05
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <bits/stdc++.h>
#define inf (1LL<<50)
using namespace std;
typedef long long ll;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int const N = 2001;
int n , m , k , a , b , c;
int chk[16] ;
ll d[N][N] , dp[(1 << 16)][17];
vector<pair<int , int> > v[N];
priority_queue<pair<ll , int> > h;
void dijkstra(int node){
    h.push(make_pair(0 , node));
    fill(d[node] , d[node] + N , inf);
    d[node][node] = 0;
    while(!h.empty()){
        auto [w , to] = h.top();
        h.pop();
        if(-w != d[node][to])
            continue;
        for(auto [to1 , w1] : v[to]){
            if(d[node][to1] > w1 - w){
                d[node][to1] = w1 - w;
                h.push(make_pair(-d[node][to1] , to1));
            }
        }
    }

}
int main()
{
    fin >> n >> m >> k;
    for(int i = 0 ; i < k ; ++ i)
        fin >> chk[i];
    for(int i = 1 ; i <= m ; ++ i){
        fin >> a >> b >> c;
        v[a].push_back(make_pair(b , c));
        v[b].push_back(make_pair(a , c));
    }
    dijkstra(1);
    for(int i = 0 ; i < k ; ++ i)
        dijkstra(chk[i]);
    dijkstra(n);
    if(k == 0){
        fout << d[n][1] << '\n';
        return 0;
    }
    int mask = (1 << k);
    for(int i = 0 ; i < mask ; ++ i)
        for(int j = 0 ; j < k ; ++ j)
            dp[i][j] = inf;
    for(int i = 0 ; i < k ; ++ i)
        dp[(1 << i)][i] = d[1][chk[i]];
    for(int i = 1 ; i < mask ; ++ i){
        for(int j = 0 ; (1 << j) <= i ; ++ j){
            if(((1 << j) & i) == 0) continue;
            for(int u = 0 ; u < k ; ++ u){
                if((1 << u) & i) continue;
                dp[i | (1 << u)][u] = min(dp[i | (1 << u)][u] , dp[i][j] + d[chk[j]][chk[u]]);
            }
        }
    }
    ll ans = inf;
    for(int i = 0 ; i < k ; ++ i)
        ans = min(ans , dp[mask - 1][i] + d[chk[i]][n]);
    fout << ans << '\n';
    return 0;
}