Pagini recente » Cod sursa (job #1958440) | Cod sursa (job #2646632) | Cod sursa (job #577332) | Cod sursa (job #2551642) | Cod sursa (job #2148606)
# include <fstream>
# define DIM 2005
# define INF 1000000000
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int b[DIM][DIM],a[DIM][DIM],d[17][(1<<17)],v[DIM],rv[(1<<17)];
int n,m,nr,x,y,cost,i,j,k,sol;
int main () {
fin>>n>>m>>nr;
v[0]=1;
for(i=1;i<=nr;i++)
fin>>v[i];
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
b[i][j]=INF;
for(i=1;i<=m;i++){
fin>>x>>y>>cost;
b[x][y]=b[y][x]=cost;
}
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(b[i][j]>b[i][k]+b[k][j]&&i!=j&&i!=k&&j!=k)
b[i][j]=b[i][k]+b[k][j];
for(i=1;i<(1<<(nr+1));i++)
for(j=0;j<=nr;j++)
d[j][i]=INF;
for(i=1,j=0;j<=nr;i*=2,j++)
rv[i]=j;
d[0][1]=0;
for(i=1;i<(1<<(nr+1));i++){
if(i%2==0)
continue;
for(j=i;j>0;j-=(j&(-j))){
x=rv[(j&(-j))];
if(d[x][i]==INF)
continue;
for(k=(i^((1<<(nr+1))-1));k>0;k-=(k&(-k))){
y=rv[(k&(-k))];
d[y][i+(k&(-k))]=min(d[y][i+(k&(-k))],d[x][i]+b[v[x]][v[y]]);
}
}
}
sol=INF;
for(i=1;i<=nr;i++)
sol=min(sol,d[i][(1<<(nr+1))-1]+b[v[i]][n]);
fout<<sol<<"\n";
return 0;
}