Pagini recente » Cod sursa (job #2526845) | Cod sursa (job #845739) | Cod sursa (job #176722) | Cod sursa (job #3272790) | Cod sursa (job #2038503)
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
typedef pair<int, int> pii;
priority_queue < pii, vector<pii>, greater<pii> > Q;
vector<pii> G[2002];
int n,m,k,d[33000][17],dp[17][33000],v[30000],mini=inf;
void dijkstra(int inode){
for(int i=1;i<=n;++i)dp[inode][i]=inf;
Q.push({0,v[inode]});
dp[inode][v[inode]]=0;
while(!Q.empty()){
int node=Q.top().second;
int dist=Q.top().first;
Q.pop();
if(dp[inode][node]<dist)continue;
dp[inode][node]=dist;
for(auto edge: G[node]){
if(dp[inode][edge.first]>dist+edge.second){
dp[inode][edge.first]=dist+edge.second;
Q.push({dp[inode][edge.first],edge.first});
}
}
}
}
int gint()
{
char ch = getchar();
while(ch < '0' || '9' < ch)
ch = getchar();
int x = 0;
while('0' <= ch && ch <= '9')
{
x = x * 10 + ch - '0';
ch = getchar();
}
return x;
}
int main()
{
freopen("ubuntzei.in", "r", stdin);
freopen("ubuntzei.out", "w", stdout);
int a,b,c;
n=gint();
m=gint();
k=gint();
for(int i=1;i<=k;++i)
v[i]=gint();
for(int i=1;i<=m;++i){
a=gint();
b=gint();
c=gint();
G[a].push_back({b,c});
G[b].push_back({a,c});
}
for(int i=1;i<=k;++i)
dijkstra(i);
v[0]=1;
dijkstra(0);
memset(d,inf,sizeof d);
/*for(int msk=1;msk< (1<<k);++msk){
if(!(msk & (msk-1))){
for(int i=0;i<k;++i)
if(msk==(1<<i))
d[msk][i]=dp[0][v[i+1]];
continue;
}
for(int i=0;i<k;++i)
for(int j=0;j<k;++j)
if(msk&(1<<i) && msk&(1<<j))
d[msk][i]=min(d[msk][i],d[msk-(1<<i)][j]+dp[j+1][v[i+1]]);
}*/
if(!k){
printf("%d\n", dp[0][n]);
return 0;
}
for(int i=0;i<k;++i)
mini=min(mini,d[(1<<k)-1][i]+dp[i+1][n]);
printf("%d\n", mini);
return 0;
}