Pagini recente » Rating Patricia Darau (Patricia1997) | Cod sursa (job #2306990) | template/despre-infoarena | Cod sursa (job #2626304) | Cod sursa (job #1126905)
//Floyd Warshall
#include<fstream>
#include<cstring>
using namespace std;
ifstream f("ubuntzei.in");
ofstream o("ubuntzei.out");
const int inf=99999999;
int n,m,pr[17],r,i,j,v[2000][2000],t,minim,minimi,b[20];
void init(int k){
b[k]=-1;
}
bool verificare(int k){
if(b[k]<r-1){
b[k]++;
return true;
}
return false;
}
bool valid(int k){
for(int i=0;i<k;i++)
if(b[i]==b[k])
return false;
return true;
}
bool solutie(int k){
return k==r-1;
}
void back(){
int k=0;
init(k);
while(k>=0){
if(verificare(k)){
if(valid(k))
if(solutie(k)){
minimi=v[1][pr[b[0]]];
for(int i=1;i<r;i++){
minimi+=v[pr[b[i-1]]][pr[b[i]]];
}
minimi+=v[pr[b[k]]][n];
if(minimi<minim)
minim=minimi;
}else k++;
}else k--;
}
}
void citire(){
int x,y,l;
f>>n>>m;
f>>r;
for(i=0;i<r;i++)
f>>pr[i];
for(i=0;i<m;i++){
f>>x>>y>>l;
v[x][y]=l;
v[y][x]=l;
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i!=j&&v[i][j]==0)
v[i][j]=inf;
}
int main(){
citire();
for(t=1;t<=n;t++)
for(i=1;i<=n;i++)
if(i!=t)
for(j=1;j<=n;j++)
if(j!=t)
if(v[t][j]!=inf&&v[i][t]!=inf&&v[i][t]+v[t][j]<v[i][j])
v[i][j]=v[i][t]+v[t][j];
if(!r)
o<<v[1][n];
else{
minim=inf;
back();
o<<minim;
}
return 0;
}