Pagini recente » Cod sursa (job #601315) | Cod sursa (job #433304) | Cod sursa (job #2454160) | Cod sursa (job #2725597) | Cod sursa (job #1026611)
#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 i,n,k,j,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,k;
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(k=1;k<=n;++k)
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
if ((a[i][k]!=Infinit) && (a[k][j]!=Infinit))
if (a[i][j]>a[i][k]+a[k][j]) a[i][j]=a[i][k]+a[k][j];
}
int main()
{
reading(n,k);
roy_floyd();
for(i=0;i<=k;++i)
v.push_back(vec[i]);
do
{
s=a[1][v[0]]+a[n][v[k]];
for(i=0;i<=k-1;++i)
s=s+a[v[i]][v[i+1]];
if (s<minim) minim=s;
}
while (next_permutation(v.begin(), v.end()));
printf("%d",minim);
return 0;
}