Cod sursa(job #2845159)

Utilizator DordeDorde Matei Dorde Data 7 februarie 2022 16:21:24
Problema Ubuntzei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <bits/stdc++.h>
#define inf (1 << 30)
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int const N = 2001;
int n , m , k , a , b , c;
int chk[16] ;
int d[N][N] , dp[(1 << 15)][N];
vector<pair<int , int> > v[N];
priority_queue<pair<int , int> > h;

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));
    }
    for(int i = 0 ; i < k ; ++ i){
        h.push(make_pair(0 , chk[i]));
        fill(d[chk[i]] , d[chk[i]] + N , inf);
        d[chk[i]][chk[i]] = 0;
        while(!h.empty()){
            auto [w , to] = h.top();
            h.pop();
            if(-w != d[chk[i]][to])
                continue;
            for(auto [w1 , to1] : v[to]){
                if(d[chk[i]][to1] > w1 - w){
                    d[chk[i]][to1] = w1 - w;
                    h.push(make_pair(-d[chk[i]][to1] , to1));
                }
            }
        }
    }
    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 ; (1 << i) < Mask ; ++ i)
        dp[(1 << i)][i] = d[chk[i]][1];
    for(int i = 1 ; (1 << i) < Mask ; ++ i){
        for(int cv = 0 ; cv < k ; ++ cv){
            if(! ((1 << cv) & i)) continue;
            for(int j = 0 ; (1 << j) <= i ; ++ j){
                if(((1 << j) & i) || d[chk[cv]][chk[j]] == inf) continue;
                dp[i | (1 << j)][chk[j]] = min(dp[i | (1 << j)][chk[j]] , dp[i][cv] + d[chk[cv]][chk[j]]);
            }
        }
    }
    int ans = inf;
    for(int i = 0 ; i < k ; ++ i){
        if(dp[Mask][i] == inf) continue;
        ans = min(ans , dp[Mask][i] + d[chk[i]][n]);
    }
    fout << ans << '\n';
    return 0;
}