Pagini recente » Cod sursa (job #2089937) | Cod sursa (job #2815326) | Cod sursa (job #2158292) | Cod sursa (job #96904) | Cod sursa (job #3039967)
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
const int maxint=2000000000;
int n,k,m,A[2001][2001],D[2001][2001],tr[20],l[20][20],p[65636][20];
int main()
{
fin >> n >> m;
fin >> k;
tr[0]=1;
for(int i=1;i<=k;i++)
fin >> tr[i];
tr[k+1]=n;
for(int i=1;i<=m;i++)
{
int x,y,c;
fin >> x >> y >> c;
A[x][y]=c;
A[y][x]=c;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(A[i][j]==0) D[i][j]=maxint;
else D[i][j]=A[i][j];
}
}
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i!=j && D[i][k]!=maxint && D[k][j]!=maxint) D[i][j]=min(D[i][j],D[i][k]+D[k][j]);
}
}
}
for(int i=0;i<=k+1;i++)
{
for(int j=0;j<=k+1;j++)
{
if(i!=j && D[tr[i]][tr[j]]!=maxint)
{
l[i][j]=l[j][i]=D[tr[i]][tr[j]];
}
}
}
for(int mask=1;mask<(1<<(k+2));mask+=2)
{
for(int j=0;j<=k+1;j++)
p[mask][j]=maxint;
}
p[1][0]=0;
for(int mask=3;mask<(1<<(k+2));mask+=2)
{
for(int i=1;i<=k+1;i++)
{
int pov=(1<<i);
if(pov&mask)
{
for(int j=0;j<=k+1;j++)
{
if(l[i][j]!=0)
{
p[mask][i]=min(p[mask][i],p[mask^pov][j]+l[j][i]);
}
}
}
}
}
fout << p[(1<<(k+2))-1][k+1];
return 0;
}