Pagini recente » Cod sursa (job #768522) | Cod sursa (job #212698) | Cod sursa (job #3174390) | Cod sursa (job #1812663) | Cod sursa (job #2322383)
#include <iostream>
#include <fstream>
#define pinf 10000000000000010
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
long long N,M,a[2010][2010],i,j,k,o[20],x,y,z,m[32780][20],c,rez,K,l,r,fv[32780];
int main()
{
c=-1;
for(i=1;i<=(1<<15);i=i<<1)
{
c++;
fv[i]=c;
}
fin>>N>>M>>K;
for(i=1; i<=N; i++)
for(j=1; j<=N; j++)
if(i!=j)
a[i][j]=pinf;
for(i=0; i<K; i++)
fin>>o[i];
for(i=1; i<=M; i++)
{
fin>>x>>y;
fin>>a[x][y];
a[y][x]=a[x][y];
}
for(k=1; k<=N; k++)
{
for(i=1; i<=N; i++)
{
for(j=1; j<=N; j++)
{
if(a[i][j]>a[i][k]+a[k][j])
{
a[i][j]=a[i][k]+a[k][j];
}
}
}
}
for(i=1; i<(1<<K); i++)
{
for(j=0; j<K; j++)
m[i][j]=pinf;
}
c=-1;
for(i=1; i<(1<<K); i=i<<1)
{
c++;
m[i][c]=a[o[c]][1];
}
for(i=1; i<(1<<K); i++)
{
r=i;
while(r!=0)
{
l=r&(-r);
r=r-l;
l=fv[l];
for(j=0; j<K; j++)
if((i&(1<<j))!=(1<<j))
{
m[i+(1<<j)][j]=min(m[i+(1<<j)][j],m[i][l]+a[o[l]][o[j]]);
}
}
}
i=(1<<K)-1;
rez=pinf;
for(j=0;j<K;j++)
{
rez=min(rez,m[i][j]+a[N][o[j]]);
}
if(K==0)
fout<<a[1][N];
else
fout<<rez;
}