Pagini recente » Cod sursa (job #1436852) | Cod sursa (job #2899805) | Cod sursa (job #140852) | Cod sursa (job #3294680) | Cod sursa (job #2851063)
#include <fstream>
#include <iostream>
#include <vector>
#include <climits>
#include <algorithm>
#define INF INT_MAX
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int a[205][205],f[15];
int ff[205];
vector<int>v;
int 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()
{
int 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];
int 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;
}