Pagini recente » Cod sursa (job #1035317) | Cod sursa (job #2387845) | Cod sursa (job #997450) | Cod sursa (job #572448) | Cod sursa (job #2488585)
#define inf 100000000
#include <bits/stdc++.h>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
vector<pair <int,int> > M[2002];
int dist[32768][2002];
priority_queue< pair<int, int>, vector <pair<int, int> > , greater<pair<int, int> > > Q;
int vi[16],fr[16];
int main()
{
int n,m,j,i,x,y,c,k,nod,v;
fin>>n>>m;
fin>>k;
int ck=k;
k++;
for(i=1;i<k;i++)
{
fin>>vi[i];
fr[vi[i]]=i;
}
for(i=1;i<=m;i++)
{
fin>>x>>y>>c;
M[x].push_back({c,y});
M[y].push_back({c,x});
}
x=1<<k;
for(i=0; i<=x;i++)
for(j=0; j<=n;j++) dist[i][j] = inf;
Q.push({0,1});
dist[0][1]=0;
while(!Q.empty())
{
nod=Q.top().second;
Q.pop();
for(i=0;i<M[nod].size();i++)
{
v=M[nod][i].second;
c=M[nod][i].first;
if(fr[v])
{for(k=1;k<x;k++)
if (k & (1<<(fr[v]-1)))
if(dist[k^(1<<(fr[v]-1))][nod]+c<dist[k][v])
{
dist[k][v]=dist[k^(1<<(fr[v]-1))][nod]+c;
Q.push({dist[k][v],v});
}
}
else
{
for(k=0;k<x;k++)
if(dist[k][v]>dist[k][nod]+c)
{
dist[k][v]=dist[k][nod]+c;
Q.push({dist[k][v],v});
}
}
}
}
fout<<dist[(1<<ck)-1][n];
return 0;
}