Pagini recente » Cod sursa (job #2696206) | Cod sursa (job #1106877) | Cod sursa (job #368606) | Cod sursa (job #2963061) | Cod sursa (job #2138256)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
#define cin fin
#define cout fout
#define int long long
const int maxn = 2002;
int n,m,k;
vector<int> ks;
vector<pair<int,int> > g[maxn];
bool viz[maxn];
int dist[maxn][maxn];
int dp[1<<16][20];
void reload(int vx) {
for(int i=1;i<=n;++i) {
viz[i] = false;
dist[vx][i] = (1e12);
}
}
void solve(int vx) {
reload(vx);
priority_queue<pair<int,int>, vector<pair<int,int> >, greater<pair<int,int> > > H;
H.push({0,vx});
dist[vx][vx] = 0;
while(!H.empty()) {
pair<int,int> t = H.top();
H.pop();
if(dist[vx][t.second]!=t.first) continue;
for(pair<int,int> nei : g[t.second]) {
if(dist[vx][nei.second] <= nei.first + t.first) continue;
dist[vx][nei.second] = nei.first + t.first;
H.push({nei.first + t.first,nei.second});
}
}
}
signed main() {
cin >> n >> m;
cin >> k;
ks.resize(k);
for(int i=0;i<k;++i) cin >> ks[i];
int x,y,c;
for(int i=0;i<m;++i) {
cin >> x >> y >> c;
g[x].push_back({c,y});
g[y].push_back({c,x});
}
solve(1);
for(int vx : ks) solve(vx);
if(!k) {
cout << dist[1][n] << '\n';
return 0;
}
for(int i=0;i<(1<<16);++i) for(int j=0;j<20;++j) dp[i][j] = (1e12);
for(int i=0;i<k;++i) dp[1<<i][i] = dist[1][ks[i]];
for(int i=2;i<=(1<<k)-1;++i) {
for(int j=0;(1<<j)<=i;++j) {
if((i>>j)&1) {
for(int k = 0;(1<<k) <= i; ++k) {
dp[i][j] = min(dp[i][k],dp[i ^ (1<<j)][k] + dist[ks[k]][ks[j]]);
}
}
}
}
int ans = (1e12);
for(int i=0;i<k;++i) {
ans = min(ans,dp[(1<<k)-1][i] + dist[ks[i]][n]);
}
cout << ans << '\n';
return 0;
}