Pagini recente » Cod sursa (job #812411) | Cod sursa (job #1109200) | Cod sursa (job #2371240) | Cod sursa (job #2923648) | Cod sursa (job #2652595)
#include <bits/stdc++.h>
#define inf 2000000000
using namespace std;
ifstream ci("ubuntzei.in");
ofstream cou("ubuntzei.out");
int n,m,k,fin=inf;
int c[2005];
vector<int>v[2005];
int dis[2005][2005];
int sol[20];
int vis[20];
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;
}
}
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]=c;
}
}
void rez(){
int k,i,p,x,y;
for(i=1;i<=n;i++){
for(k=1;k<=n-i;k++){
//intre i si i+k;
x=i;
y=i+k;
for(p=x+1;p<=y-1;p++){
if(dis[x][p]+dis[p][y]<dis[x][y]){
dis[x][y]=dis[x][p]+dis[p][y];
}
}
}
}
for(i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
//cout<<i<<" "<<j<<" "<<dis[i][j]<<"\n";
}
}
}
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;
}