Pagini recente » Cod sursa (job #991826) | Cod sursa (job #1513179) | Cod sursa (job #3272613) | Cod sursa (job #822673) | Cod sursa (job #2060994)
#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);
scanf("%d",&x);
if(x!=1) {
v[1]=1;
k++;
v[2]=x;
for(int i=3;i<=k;i++)
scanf("%d",&v[i]);
if(v[k]!=n)
v[++k]=n;
}
else{
v[1]=1;
for(int i=2;i<=k;i++)
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++)
// {
//
// }
backit(2);
printf("%d",Min);
return 0;
}