Pagini recente » Cod sursa (job #2149676) | Cod sursa (job #1915175) | Cod sursa (job #2210433) | Cod sursa (job #2968281) | Cod sursa (job #1118460)
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#define INF 0x3f3f3f3f
#define Nmax 2050
using namespace std;
vector <pair <int, int> > Graf[Nmax];
priority_queue < pair <int, int>, vector <pair <int, int> >, greater <pair <int, int> > > Coada;
int D[Nmax][Nmax];
int N,M,K;
int Ksir[20];
int DP[20][1<<20];
int Minim;
void Citire()
{
int x,y,c;
scanf("%d %d",&N,&M);
scanf("%d ",&K);
Ksir[1]=1;
for(int i=2;i<=K+1;++i)
scanf("%d ",&Ksir[i]);
K++;
Ksir[++K]=N;
for(int i=1;i<=M;++i)
{
scanf("%d %d %d",&x,&y,&c);
Graf[x].push_back(make_pair(c,y));
Graf[y].push_back(make_pair(c,x));
}
for(int i=1;i<=N;++i)
for(int j=1;j<=N;++j)
if(i!=j)
D[i][j]=INF;
}
void Dijkstra(int i)
{
Coada.push(make_pair(0,i));
while(!Coada.empty())
{
int t=Coada.top().second;
Coada.pop();
for(int j=0;j<Graf[t].size();++j)
{
int v=Graf[t][j].second;
int c=Graf[t][j].first;
if(D[i][v]>D[i][t]+c)
{
D[i][v]=D[i][t]+c;
Coada.push(make_pair(D[i][v],v));
}
}
}
}
void Formare()
{
for(int i=1;i<=K;++i)
for(int s=1;s<=2<<K-1;++s)
if(s==(1<<i))
DP[i][s]=D[1][i];
else
DP[i][s]=INF;
}
void Rezolvare()
{
for(int s=1;s<=(1<<K)-1;++s)
for(int i=1;i<=K;++i)
{
int Min=DP[i][s];
for(int j=1;j<=K;++j)
if(j!=i && (s & (1<<j)))
if(Min>DP[j][s-(1<<i)]+D[i][j])
Min=DP[j][s-(1<<i)]+D[i][j];
DP[i][s]=Min;
}
Minim=INF;
for(int i=1;i<=K;++i)
if(DP[i][N]<Minim)
Minim=DP[i][N];
}
int main()
{
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
Citire();
for(int i=1;i<=K+2;++i)
Dijkstra(Ksir[i]);
Formare();
Rezolvare();
if(Minim<INF)
printf("%d",Minim);
else
printf("%d",0);
return 0;
}