Pagini recente » Borderou de evaluare (job #3331217) | Cod sursa (job #3324607) | Cod sursa (job #3315489) | Cod sursa (job #3330890) | Cod sursa (job #3343872)
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
#define NMAX 2002
#define KMAX 16
int n,m,k,dp[1<<KMAX][KMAX];
vector<int>ubs,rd,d[KMAX];
vector<pair<int,int>>g[NMAX];
inline auto dijkstra(int start,vector<int>&dist)->void{
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>pq;
pq.push({0,start});
dist.resize(n+1,0X7FFFFFFF);
dist[start]=0;
while(!pq.empty()){
int i=pq.top().second,c=pq.top().first;
pq.pop();
if(c>dist[i])continue;
for(auto it:g[i]){
int u=it.first;
c=it.second;
if(dist[u]>dist[i]+c){
dist[u]=dist[i]+c;
pq.push({dist[u],u});
}
}
}
}
auto main()->signed{
#ifndef LOCAL
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
#endif // LOCAL
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
cin>>n>>m>>k;
for(int i=1;i<=k;++i){
int x;
cin>>x;
ubs.push_back(x);
}
for(int i=1;i<=m;++i){
int x,y,z;
cin>>x>>y>>z;
g[x].push_back({y,z});
g[y].push_back({x,z});
}
dijkstra(1,rd);
for(int mk=0;mk<(1<<k);++mk){
fill(dp[mk],dp[mk]+k,0X7FFFFFFF);
}
for(int i=0;i<k;++i){
dijkstra(ubs[i],d[i]);
dp[1<<i][i]=rd[ubs[i]];
}
if(k==0){
cout<<rd[n];
return 0;
}
for(int mk=1;mk<(1<<k);++mk){
for(int i=0;i<k;++i){
if(!(mk&(1<<i)))continue;
for(int j=0;j<k;++j){
if(!(mk&(1<<j)))continue;
int u=ubs[i];
dp[mk][i]=min(dp[mk][i],dp[mk-(1<<i)][j]+d[j][u]);
}
}
}
int ans=0X7FFFFFFF;
for(int i=0;i<k;++i){
ans=min(ans,dp[(1<<k)-1][i]+d[i][n]);
}
cout<<ans;
return 0;
}