Pagini recente » Cod sursa (job #1557530) | Cod sursa (job #1761441) | Cod sursa (job #2308681) | Cod sursa (job #360876) | Cod sursa (job #1896568)
#include <fstream>
#include<climits>
using namespace std;
ifstream cin ("ubuntzei.in");
ofstream cout ("ubuntzei.out");
int n,m,k,noduri[20],coada[20010],nr,h;
int dist[20][2010];
int sol[20][66010];
int start[2020];
struct bla
{
int varf,binar;
} coada2[1000000];
struct awesome
{
int nod,urm,cost;
} t[20100];
void read ()
{ int a,b,c,p=0;
cin>>n>>m>>k;
noduri[0]=1;
for(int i=1;i<=k;++i) cin>>noduri[i];
for(int i=1;i<=m;i++)
{
cin>>a>>b>>c;
t[++p].nod=b; t[p].cost=c; t[p].urm=start[a]; start[a]=p;
t[++p].nod=a; t[p].cost=c; t[p].urm=start[b]; start[b]=p;
}
int r=1;
for(int i=0;i<=k;i++) h=h+r,r*=2;
}
void init ()
{
for(int i=0;i<=k;i++)
for(int j=1;j<=n;j++)
dist[i][j]=INT_MAX;
}
void ford (int varful)
{ dist[nr][varful]=0;
int pi=1,ps=1;
coada[1]=varful;
while(ps<=pi)
{
int x=start[coada[ps]];
while(x)
{
if(dist[nr][coada[ps]]+t[x].cost<dist[nr][t[x].nod])
dist[nr][t[x].nod]=dist[nr][coada[ps]]+t[x].cost,coada[++pi]=t[x].nod;
x=t[x].urm;
} ++ps;
}
}
void construct_lungimi ()
{
for(nr=0;nr<=k;++nr)
ford(noduri[nr]);
}
void init2 ()
{ int y=1<<(k+1);
for(int i=0;i<=k;i++)
for(int j=1;j<=y;j++)
sol[i][j]=INT_MAX;
}
void a_different_kind_of_ford ()
{
int pi=1,ps=1;
coada2[1].varf=0;
coada2[1].binar=1;
sol[0][1]=0;
while(ps<=pi)
{
for(int i=1;i<=k;i++)
{ int w=1<<i;
if(coada2[ps].varf!=i)
{
int binary=coada2[ps].binar | w;
if(sol[coada2[ps].varf][coada2[ps].binar]+dist[coada2[ps].varf][noduri[i]]<sol[i][binary])
sol[i][binary]=sol[coada2[ps].varf][coada2[ps].binar]+dist[coada2[ps].varf][noduri[i]],coada2[++pi].varf=i,coada2[pi].binar=binary;
}
} ++ps;
}
}
void write ()
{ int maxim=INT_MAX;
for(int i=0;i<=k;i++)
if( sol[i][h]!=INT_MAX && sol[i][h]+dist[i][n]<maxim ) maxim=sol[i][h]+dist[i][n];
cout<<maxim<<"\n";
}
int main()
{
read();
init();
init2();
construct_lungimi();
a_different_kind_of_ford();
write();
cin.close();
cout.close();
return 0;
}