Pagini recente » Cod sursa (job #3269508) | Cod sursa (job #1981481) | Cod sursa (job #1917073) | Cod sursa (job #1538233) | Cod sursa (job #1026627)
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
#define Nmax 2001
#define Infinit 2000000000
using namespace std;
int a[Nmax][Nmax];
int vec[Nmax];
int i1,n,k,s=0,minim=Infinit;
vector <int> v;
void reading(int &n,int &k)
{
int j,m;
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
scanf("%d %d",&n,&m);
scanf("%d",&k);--k;
for(j=0;j<=k;++j)
scanf("%d ",&vec[j]);
for(j=1;j<=m;++j)
{
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
a[x][y]=z;
a[y][x]=z;
}
}
void roy_floyd()
{
int i,j,k1;
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
if (i!=j) if (a[i][j]==0) a[i][j]=Infinit;
for(k1=1;k1<=n;++k1)
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
if ((a[i][k1]!=Infinit) && (a[k1][j]!=Infinit))
if (a[i][j]>a[i][k1]+a[k1][j]) a[i][j]=a[i][k1]+a[k1][j];
}
int main()
{
reading(n,k);
roy_floyd();
if (k<0) printf("%d",a[1][n]);
else
{
for(i1=0;i1<=k;++i1)
v.push_back(vec[i1]);
do
{
s=a[1][v[0]]+a[n][v[k]];
for(i1=0;i1<=k-1;++i1)
s=s+a[v[i1]][v[i1+1]];
if (s<minim) minim=s;
}
while (next_permutation(v.begin(), v.end()));
printf("%d",minim);
}
return 0;
}