Pagini recente » Cod sursa (job #2722131) | Cod sursa (job #251233) | Cod sursa (job #1899237) | Cod sursa (job #1132355) | Cod sursa (job #1759172)
#include <fstream>
#include<climits>
using namespace std;
ifstream cin ("ubuntzei.in");
ofstream cout ("ubuntzei.out");
int a[16][33000],d[2002],n,m,k,v[2002],t[3][20002],coada_mica[200001],start[2002],ppi=1,h[2002],q,limit,e[20],maxx=INT_MAX;
bool viz_mic[2002];
struct bla
{
int nod,nr;
} coada_mare[200001];
void read ()
{ int c,x,y,z,k1=0;
cin>>n>>m>>k;
for(int i=1;i<=k;i++) cin>>c,v[c]=i,e[i]=c;
for(int i=1;i<=m;i++)
{
cin>>x>>y>>z;
t[0][++k1]=y; t[2][k1]=z; t[1][k1]=start[x]; start[x]=k1;
t[0][++k1]=x; t[2][k1]=z; t[1][k1]=start[y]; start[y]=k1;
}
}
void init ()
{ int p=1;
for(int i=0;i<k;i++)
{
limit+=p; p*=2;
}
for(int i=0;i<=k;i++)
for(int j=0;j<=limit;j++)
a[i][j]=INT_MAX;
}
void pune_in_coada_mare (int nodd,int nrct,int z)
{
int c=nrct | 1<<(v[nodd]-1);
if(z>=a[v[nodd]][c]) return; a[v[nodd]][c]=z;
coada_mare[++ppi].nod=nodd;
coada_mare[ppi].nr=c;
}
void ford (int nodd)
{
int pi=1,ps=1; coada_mica[1]=nodd; d[nodd]=0;
while(ps<=pi)
{
int x=start[coada_mica[ps]];
while(x)
{
if(d[coada_mica[ps]]+t[2][x]<d[t[0][x]] || h[t[0][x]]<q)
{ h[t[0][x]]=q;
d[t[0][x]]=d[coada_mica[ps]]+t[2][x]; coada_mica[++pi]=t[0][x];
} x=t[1][x];
} ps++;
}
}
void ford_secundar (int nodd,int nrct)
{
int pi=1,ps=1; coada_mica[1]=nodd; if(nodd==1) d[nodd]=0; else d[nodd]=a[v[nodd]][nrct];
while(ps<=pi)
{
int x=start[coada_mica[ps]];
while(x)
{
if(d[coada_mica[ps]]+t[2][x]<d[t[0][x]] || h[t[0][x]]<q)
{ h[t[0][x]]=q;
d[t[0][x]]=d[coada_mica[ps]]+t[2][x]; if(viz_mic[t[0][x]]==0) coada_mica[++pi]=t[0][x]; viz_mic[t[0][x]]=1;
if(v[t[0][x]]!=0) pune_in_coada_mare(t[0][x],nrct,d[t[0][x]]);
} x=t[1][x];
} ps++;viz_mic[coada_mica[ps]]=0;
}
}
void ford_principal ()
{
int ps=1;
coada_mare[1].nod=1; coada_mare[1].nr=0;
while(ps<=ppi)
{ q++;
ford_secundar(coada_mare[ps].nod,coada_mare[ps].nr);
ps++;
}
}
void write ()
{
for(int i=1;i<=k;i++)
{ q++;
ford(e[i]);
if(a[i][limit]+d[n]<maxx) maxx=a[i][limit]+d[n];
}
cout<<maxx;
}
void k_0 ()
{ q=1;
ford_secundar(1,1);
cout<<d[n];
}
int main()
{
read();
init();
if(k>0)
{
ford_principal();
write();
}
else k_0();
return 0;
}