Pagini recente » Cod sursa (job #1388808) | Cod sursa (job #2071583) | Cod sursa (job #2840271) | Cod sursa (job #1287060) | Cod sursa (job #1128857)
#include <cstdio>
#include <vector>
#include <cmath>
#define inf 2000000
using namespace std;
struct vecini
{
vector <int> v;
};
vecini g[2009];
int c[20],a[2009][2009],dp[2009][2009];
int main()
{
int n,m,i,j,k,nr,x,y,z,l;
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
scanf("%d%d",&n,&m);
scanf("%d",&l);
for(i=1;i<=l;i++)
scanf("%d",&c[i]);
int calcul= pow((double)2,(double)l)-1;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
a[x][y]=z;
a[y][x]=z;
}
for(k=1;k<=n;k++)
{
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if(a[i][k]!=0&&a[j][k]!=0)
if(a[i][k]+a[k][j]<a[i][j]||a[i][j]==0)
{
a[i][j]=a[i][k]+a[k][j];
a[j][i]=a[i][k]+a[k][j];
}
}
k=l;
if(k==0)
printf("%d",a[1][n]);
else
{
for(i=1;i<=n;i++)
dp[i][0]=a[1][i];
for(i=1;i<=n;i++)
for(nr=1;nr<=calcul;++nr)
{
dp[i][nr]=inf;
}
for(nr=1;nr<=calcul;nr++)//submultimea
for(i=1;i<=n;i++)
for(j=1;j<=k;j++)
if(((1<<(j-1))&nr)!=0)
{
int x=pow(2,(double)j-1);
if(dp[i][nr]>dp[c[j]][nr-x]+a[i][c[j]])
dp[i][nr]=dp[c[j]][nr-x]+a[i][c[j]];
}
printf("%d\n",dp[n][calcul]);
}
return 0;
}