Pagini recente » Cod sursa (job #461455) | Cod sursa (job #294903) | Cod sursa (job #2123061) | Cod sursa (job #614120) | Cod sursa (job #1759651)
#include <fstream>
#include<climits>
using namespace std;
ifstream cin ("ubuntzei.in");
ofstream cout ("ubuntzei.out");
int a[16][2002],x[16],n,m,k,z[20],t[3][20001],start[2002],coada[100001],o,maxx=INT_MAX,s=0,v[20];
void read ()
{ int x,y,r,k1=0;
cin>>n>>m>>k;
for(int i=1;i<=k;i++)
cin>>z[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[ps]=nod; a[o][nod]=0;
while(ps<=pi)
{
int x=start[coada[ps]];
while(x)
{
if(a[o][coada[ps]]+t[2][x]<a[o][t[0][x]])
{
a[o][t[0][x]]=a[o][coada[ps]]+t[2][x]; coada[++pi]=t[0][x];
} x=t[1][x];
} ps++;
}
}
void init ()
{
for(int i=1;i<=k+2;i++)
for(int j=1;j<=n;j++)
a[i][j]=INT_MAX;
}
void construct_man ()
{
for(o=1;o<=k;o++)
ford(z[o]);
ford(1);
o++; ford(n);
}
void verif_man ()
{
if(s+a[k+1][z[x[1]]]+a[k+2][z[x[k]]]+a[x[k-1]][z[x[k]]]<maxx) maxx=s+a[k+1][z[x[1]]]+a[k+2][z[x[k]]]+a[x[k-1]][z[x[k]]];
}
void up_date_man (int k1)
{
if(k1>1)
s+=a[x[k1-1]][z[x[k1]]];
}
void up_date_man_minus (int k1)
{
s-=a[x[k1-1]][z[x[k1]]];
}
void bkt ()
{
int k1=1;
while(k1)
{
if(x[k1]<k)
{ x[k1]++;
if(v[x[k1]]==0)
{
if(k1==k) verif_man();
else { up_date_man(k1),v[x[k1]]=1,x[++k1]=0;}
}
}
else {k1--,v[x[k1]]=0,up_date_man_minus(k1);}
}
}
void write ()
{
cout<<maxx;
}
int main()
{
read();
init();
construct_man();
if(k>0)
bkt();
else maxx=a[1][n];
write();
cin.close();
cout.close();
return 0;
}