Pagini recente » Cod sursa (job #1737132) | Cod sursa (job #712776) | Cod sursa (job #2743308) | Cod sursa (job #483436) | Cod sursa (job #2305754)
#include <bits/stdc++.h>
#define N 17
#define NX 2001
#define INF 100000001
#define ll long long
#define f first
#define s second
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
int dp[1<<N][N], C[N][N], n, m, k, v[NX], P[N];
vector< pair<int,int> > a[NX];
priority_queue <pair<int,int> > h;
void dij(){
int i,cur;
while(!h.empty()){
i=h.top().s;
cur=-h.top().f;
h.pop();
if(v[i]<0){
v[i]=-v[i];
for(auto it:a[i]){
if(!v[it.s] || cur+it.f<-v[it.s]){
h.push({-(cur+it.f), it.s});
v[it.s]=-(cur+it.f);
}
}
}
}
}
int main(){
int x,y,w,i,j,o;
in>>n>>m>>k;
P[1]=1;
P[2]=n;
k+=2;
for(i=3; i<=k; ++i)
in>>P[i];
for(i=1; i<=m; ++i){
in>>x>>y>>w;
a[x].push_back({w,y});
a[y].push_back({w,x});
}
for(i=1; i<=k; ++i){
h.push({-1,P[i]});
v[P[i]]=-1;
dij();
for(j=1; j<=k; ++j)
C[i-1][j-1]=v[P[j]]-1;
memset(v, 0, sizeof(v));
}
for(i=0; i< (1<<k); ++i){
for(j=0; j<k; ++j){
dp[i][j]=1<<29;
if(i&(1<<j))
for(o=0; o<k; ++o)
if((i&(1<<o)) && (o!=j))
dp[i][j]=min(dp[i][j], dp[i^(1<<j)][o]+C[j][o]);
}
}
out<<dp[(1<<k)-1][k-1];
return 0;
}