Pagini recente » Cod sursa (job #1052896) | Cod sursa (job #2549734) | Cod sursa (job #1485523) | Cod sursa (job #1441207) | Cod sursa (job #2653187)
#include <bits/stdc++.h>
#define inf 1000000000
using namespace std;
ifstream ci("ubuntzei.in");
ofstream cou("ubuntzei.out");
int n,m,k,fin=inf;
int c[20005];
vector<int>v[20005];
int dis[20005][20005];
int sol[200];
int vis[200];
void cit(){
ci>>n>>m>>k;
int a,b,g;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
dis[i][j]=inf;
if(i==j){
dis[i][j]=0;
}
}
}
for(int i=1;i<=k;i++){
ci>>c[i];
}
for(int i=1;i<=m;i++){
ci>>a>>b>>g;
if(a>b){
swap(a,b);
}
dis[a][b]=g;
dis[b][a]=g;
//dis[b][a]=c;
}
}
void rez(){
int j,i,p,x,y;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
for(p=1;p<=n;p++){
//cout<<i<<" "<<p<<" "<<j<<"\n";
//cout<<dis[i][p]<<" "<<dis[p][j]<<" "<<dis[i][j]<<"\n\n";
if(dis[i][p]+dis[p][j]<dis[i][j]){
dis[i][j]=dis[i][p]+dis[p][j];
}
}
}
}
}
void afis(){
int distanta=0;
distanta+=dis[1][sol[1]];
for(int i=2;i<=k;i++){
//cout<<sol[i]<<" ";
distanta+=dis[sol[i-1]][sol[i]];
}
distanta+=dis[sol[k]][n];
fin=min(fin,distanta);
}
void Back(int p){
if(p==k+1){
afis();
}else{
for(int i=1;i<=k;i++){
while(vis[i]==1){
i++;
}
if(i>k){
return;
}
vis[i]=1;
sol[p]=c[i];
Back(p+1);
vis[i]=0;
}
}
}
int main()
{
cit();
rez();
Back(1);
cou<<fin;
return 0;
}