Pagini recente » Cod sursa (job #2969787) | Cod sursa (job #72100) | Cod sursa (job #828149) | Cod sursa (job #2465699) | Cod sursa (job #3198743)
#include <bits/stdc++.h>
#define INF 1000000000
#define DIM 2000
#define E 15
#define pii pair<int,int>
#define pipii pair<int,pii>
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int n,m,k;
int id[DIM+5];
int x,y,c;
vector <pii> L[DIM+5];
int d[DIM+5][1<<(E+1)];
priority_queue <pipii,vector<pipii>,greater<pipii>> q;
void dijkstra(int start){
d[start][0] = 0;
q.push({0,{start,0}});
while(!q.empty()){
int cost = q.top().first;
int nod = q.top().second.first;
int l = q.top().second.second;
q.pop();
//cout<<cost<<" "<<nod<<" "<<l<<'\n';
if(d[nod][l] != cost){
continue;
}
for(int i=0;i<L[nod].size();i++){
int vec = L[nod][i].first;
int c = L[nod][i].second;
int newl = l;
int newcost = cost+c;
if(id[vec]!=-1){
if(newl & (1<<id[vec])){
continue;
}
newl += (1<<id[vec]);
}
if(d[vec][newl] > newcost){
d[vec][newl] = newcost;
q.push({d[vec][newl],{vec,newl}});
}
}
}
}
int main(){
f>>n>>m;
f>>k;
for(int i=1;i<=n;i++){
id[i] = -1;
}
for(int i=0;i<k;i++){
f>>x;
id[x] = i;
}
for(int i=1;i<=m;i++){
f>>x>>y>>c;
L[x].push_back({y,c});
L[y].push_back({x,c});
}
for(int i=1;i<=n;i++){
for(int l = 0;l<(1<<k);l++){
d[i][l] = INF;
}
}
dijkstra(1);
g<<d[n][(1<<k) - 1];
return 0;
}