Pagini recente » Cod sursa (job #1156260) | Cod sursa (job #2547659) | Cod sursa (job #2910296) | Cod sursa (job #2250586) | Cod sursa (job #2851062)
#include <fstream>
#include <iostream>
#include <vector>
#include <climits>
#include <algorithm>
#define INF INT_MAX
#define ll long long int
using namespace std;
ifstream fin("ubuntuzei.in");
ofstream fout("ubuntuzei.out");
int a[1005][1005],f[105];
int ff[1005];
vector<int>v;
ll V,E,R,MIN=INT_MAX;
int Floyd()
{
for(int i=1;i<=V;i++)
for(int j=1;j<=V;j++)
if(!a[i][j])
a[i][j]=INF;
for(int i=1;i<=V;i++)
a[i][i]=0;
for(int k=1;k<=V;k++)
for(int i=1;i<=V;i++)
for(int j=1;j<=V;j++)
if(a[i][j]>(a[i][k]+a[k][j])
&& a[i][k]!=INF && a[k][j]!=INF)
a[i][j]=a[i][k]+a[k][j];
}
void sol()
{
ll sum=0;
for(int i=1;i<=v.size();i++)
sum+=a[f[i-1]][f[i]];
sum+=a[1][f[1]]+a[f[v.size()]][V];
ll y=sum;
MIN=min(MIN,y);
}
void back(int k)
{
for(auto i:v)
{
if(a[f[k-1]][i]!=INF && a[f[k-1]][i]!=0 && !ff[i] || k==1)
{
f[k]=i,ff[i]=1;
if(k==v.size())
sol();
else if(k<v.size())
back(k+1);
ff[i]=0;
}
}
}
void read()
{
fin>>V>>E>>R;
for(int i=1;i<=R;i++)
{
int y;
fin>>y;
v.push_back(y);
}
for(int i=1;i<=E;i++)
{
int x,y,z;
fin>>x>>y>>z;
a[x][y]=a[y][x]=z;
}
}
int main()
{
read();
Floyd();
f[0]=0;
if(v.size()!=0)
back(1);
else
MIN=a[1][V];
fout<<MIN;
}