Pagini recente » Cod sursa (job #509296) | Cod sursa (job #308325) | Cod sursa (job #1316942) | Cod sursa (job #573682) | Cod sursa (job #2845167)
#include <bits/stdc++.h>
#define inf (1 << 30)
#define int long long
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 << 16)][17];
vector<pair<int , int> > v[N];
priority_queue<pair<int , int> > h;
int32_t 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 [to1 , w1] : 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 ; i < Mask ; ++ i){
for(int cv = 0 ; (1 << cv) <= i ; ++ 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)][j] = min(dp[i | (1 << j)][j] , dp[i][cv] + d[chk[cv]][chk[j]]);
}
}
}
int ans = inf;
for(int i = 0 ; i < k ; ++ i){
if(dp[Mask - 1][i] == inf) continue;
ans = min(ans , dp[Mask - 1][i] + d[chk[i]][n]);
}
fout << ans << '\n';
return 0;
}