Pagini recente » Cod sursa (job #366161) | Cod sursa (job #2757504) | Cod sursa (job #2624520) | Cod sursa (job #893613) | Cod sursa (job #2061011)
#include <bits/stdc++.h>
using namespace std;
#define INF 999999999
int v[2003],ap[2003],sum[2003],x,y,c,m,n,p,L,xi,yi,k,st[2003],Min=INF;
int a[2003][2003];
bool valid(int k)
{
if(sum[k-1]+(a[st[k]][st[k-1]])>Min)
return 0;
sum[k]=sum[k-1]+(a[st[k]][st[k-1]]);
return 1;
}
bool sol(int p)
{
if(p==k-1) return 1;
return 0;
}
void backit(int p)
{
for(int i=2;i<k;i++)
{
st[p]=v[i];
if(ap[v[i]]==0){
ap[v[i]]=1;
if(valid(p)){
if(sol(p)){
sum[k]=sum[k-1]+(a[st[k-1]][n]);
if(sum[k]<Min)
Min=sum[k];
}
if(p<k-1)backit(p+1);
}
ap[v[i]]=0;
}
}
}
int main()
{
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
scanf("%d%d",&n,&m);
scanf("%d",&k);
for(int i=1;i<=k;i++)
scanf("%d",&v[i]);
sort(v+1,v+k+1);
if(v[1]!=1){
for(int i=k+1;i>1;i--)
v[i]=v[i-1];
v[1]=1;
k++;
}
if(v[k]!=n)
v[++k]=n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j)
a[i][j]=INF;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&c);
a[x][y]=a[y][x]=c;
// d[x][y]=d[y][x]=c;
}
for(int r=1;r<=n;r++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=min(a[i][j],a[i][r] + a[r][j]);
st[1]=1;
st[k]=n;
// for(int i=1;i<k;i++)
// for(int j=i+1;j<=k;j++)
// {
//
// }
if(k==0)
printf("%d",a[1][n]);
else{
backit(2);
printf("%d",Min);
}
return 0;
}