Pagini recente » Cod sursa (job #3338084) | Cod sursa (job #3315173) | Cod sursa (job #3315174) | Cod sursa (job #3335775) | Cod sursa (job #3343870)
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
#define NMAX 2002
#define KMAX 16
int n,m,k,d[NMAX][1<<KMAX],ci[NMAX];
vector<pair<int,int>>g[NMAX];
struct path{
int nod,c,mk;
friend bool operator<(const path&p1,const path&p2){
if(p1.c!=p2.c)return p1.c>p2.c;
if(p1.mk!=p2.mk)return p1.mk<p2.mk;
return p1.nod<p2.nod;
}
};
priority_queue<path>pq;
signed main(){
#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;
ci[x]=i;
}
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});
}
for(int i=0;i<=n;++i){
for(int mk=0;mk<(1<<k);++mk){
d[i][mk]=0x7fffffff;
}
}
d[1][0]=0;
pq.push({1,0,0});
while(!pq.empty()){
int i=pq.top().nod,c=pq.top().c,mk=pq.top().mk;
pq.pop();
if(c>d[i][mk])continue;
for(auto it:g[i]){
int nmk=mk;
if(ci[it.first])nmk|=(1<<(ci[it.first]-1));
if(d[it.first][nmk]>d[i][mk]+it.second){
d[it.first][nmk]=d[i][mk]+it.second;
pq.push({it.first,d[it.first][nmk],nmk});
}
}
}
cout<<d[n][(1<<k)-1];
return 0;
}