Pagini recente » Cod sursa (job #1163480) | Cod sursa (job #823637) | Cod sursa (job #2225775) | Cod sursa (job #3178978) | Cod sursa (job #1759790)
#include <fstream>
#include<climits>
using namespace std;
ifstream cin ("ubuntzei.in");
ofstream cout ("ubuntzei.out");
int d[16][33003],a[18][2002],z[20],coada_m[100001],n,m,k,t[3][20002],start[2002],o,viz[2002],q[2002],b[16][33000],maxx=INT_MAX;
struct bla
{
int nod,nr;
} coada[300001];
void read ()
{ int x,y,r,k1=0;
cin>>n>>m>>k;
for(int i=1;i<=k;i++)
cin>>z[i],q[z[i]]=i;
for(int i=1;i<=m;i++)
{
cin>>x>>y>>r;
t[0][++k1]=y; t[2][k1]=r; t[1][k1]=start[x]; start[x]=k1;
t[0][++k1]=x; t[2][k1]=r; t[1][k1]=start[y]; start[y]=k1;
}
}
void ford (int nod)
{
int pi=1,ps=1;
coada_m[1]=nod; a[o][nod]=0;
while(ps<=pi)
{
int x=start[coada_m[ps]];
while(x)
{
if(a[o][coada_m[ps]]+t[2][x]<a[o][t[0][x]])
{
a[o][t[0][x]]=a[o][coada_m[ps]]+t[2][x]; if(viz[t[0][x]]==0) coada_m[++pi]=t[0][x]; viz[t[0][x]]=1;
} x=t[1][x];
} ps++; viz[coada_m[ps]]=0;
}
}
void construct_man ()
{
for(o=1;o<=k;o++)
ford(z[o]);
ford(1); o++;
ford(n);
}
void init ()
{
for(int i=1;i<=k+2;i++)
for(int j=1;j<=n;j++)
a[i][j]=INT_MAX;
for(int i=0;i<=k;i++)
for(int j=0;j<=33000;j++)
d[i][j]=INT_MAX;
}
void up_date_here_man (int nrct,int nod,int &pi)
{
for(int i=1;i<=k;i++)
{
if(q[nod]!=i)
{ int nrcrt=nrct | (1<<(i-1));
if(d[q[nod]][nrct]+a[q[nod]][z[i]]<d[i][nrcrt])
{
d[i][nrcrt]=d[q[nod]][nrct]+a[q[nod]][z[i]]; if(b[i][nrcrt]==0) {coada[++pi].nod=z[i]; coada[pi].nr=nrcrt;} b[i][nrcrt]=1;
}
}
}
}
void up_date_coada_man (int &pi)
{
for(int i=1;i<=k;i++)
{ int limit=1<<(i-1);
d[i][limit]=a[k+1][z[i]]; coada[++pi].nod=z[i]; coada[pi].nr=1<<(i-1);
}
}
void ford_smecher ()
{
int pi=0,ps=1;
d[0][0]=0; up_date_coada_man (pi);
while(ps<=pi)
{
up_date_here_man(coada[ps].nr,coada[ps].nod,pi);
ps++; b[q[coada[ps].nod]][coada[ps].nr]=0;
}
}
int calc ()
{ int p=1,s=0;
for(int i=0;i<k;i++)
{
s+=p; p*=2;
}
return s;
}
void write ()
{ int limit=calc();
for(int i=1;i<=k;i++)
{
if(d[i][limit]+a[o][z[i]]<maxx) maxx=d[i][limit]+a[o][z[i]];
}
cout<<maxx;
}
void k_0 ()
{
cout<<a[1][n];
}
int main()
{
read();
init();
construct_man();
if(k==0) k_0();
else {
ford_smecher();
write();}
return 0;
}