Pagini recente » Cod sursa (job #2680991) | Cod sursa (job #285050) | Cod sursa (job #1110289) | Cod sursa (job #2886119) | Cod sursa (job #3200392)
#include <fstream>
using namespace std;
#define INF 1000000000
int c[2001][2001];
int min0=INF;
int k,m,n,sol[101],v[101],f[2001];
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
void verif(){
int nod = 1;
int S = 0;
for(int i=1;i<=k;i++){
S+=c[nod][sol[i]];
nod=sol[i];
}
S+=c[nod][n];
//for(int i=1;i<=k;i++)
//cout<<sol[i]<<" ";
min0=min(min0,S);
}
void back(int poz){
if(poz==k+1)
verif();
else{
for(int i=1;i<=k;i++)
if(f[v[i]]==0){
f[v[i]]=1;
sol[poz]=v[i];
back(poz+1);
f[v[i]]=0;
}
}
}
int main(){
fin>>n>>m;
fin>>k;
for(int i=1;i<=k;i++)
fin>>v[i];
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
c[i][j]=INF;
c[i][i]=0;
}
while(m--){
int i,j,cost;
fin>>i>>j>>cost;
c[i][j]=cost;
c[j][i]=cost;
}
//for(int i=1;i<=n;i++)
// c[i][i]=0;
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(c[i][j]>c[i][k]+c[k][j])
c[i][j]=c[i][k]+c[k][j];
// for(int i=1;i<=n;i++)
// c[i][i]=0;
back(1);
fout<<min0;
return 0;
}