Pagini recente » Cod sursa (job #435469) | Cod sursa (job #2370508) | Cod sursa (job #2559246) | Cod sursa (job #991338) | Cod sursa (job #2845183)
#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;
}