Pagini recente » Cod sursa (job #2504404) | Cod sursa (job #1654182) | Cod sursa (job #434195) | Cod sursa (job #2653694) | Cod sursa (job #2481078)
#include <bits/stdc++.h>
#define nmax 2005
#define smax 32770
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
int n,m,k,prt[nmax],v[nmax][smax];
bool processed[nmax][smax];
vector <pair<int,int> > lista[nmax];
void read(){
in >> n >> m;
in >> k;
for(int i=1; i<=k; i++){
int x;
in >> x;
prt[x]=i;
}
for(int i=1; i<=m; i++){
int x,y,cost;
in >> x >> y >> cost;
lista[x].push_back({y,cost});
lista[y].push_back({x,cost});
}
}
priority_queue <pair<int,pair<int,int> > > pq;
void dijkstra(){
for(int i=1; i<=n; i++)
for(int j=0; j<smax; j++)
v[i][j]=INT_MAX;
pq.push({0,{1,0}});
v[1][0]=0;
while(!pq.empty()){
int cost = -pq.top().first;
int node = pq.top().second.first;
int masca = pq.top().second.second;
pq.pop();
if(processed[node][masca]) continue;
processed[node][masca]=1;
if(node == n && masca == (1<<k)-1){
out << v[node][masca] << '\n';
return;
}
for(auto x:lista[node]){
int vecin = x.first;
int dist = x.second;
int masca_noua;
if(prt[vecin])
masca_noua = (masca | (1<<(prt[vecin]-1)));
else
masca_noua = masca;
if(cost + dist < v[vecin][masca_noua]){
v[vecin][masca_noua] = cost+dist;
pq.push({-v[vecin][masca_noua],{vecin,masca_noua}});
}
}
}
}
int main()
{
read();
dijkstra();
}