Pagini recente » Cod sursa (job #1055449) | Cod sursa (job #43596) | Cod sursa (job #1100158) | Cod sursa (job #989658) | Cod sursa (job #669925)
Cod sursa(job #669925)
#include<cstdio>
#include<climits>
#define inf 2005
int A[inf][inf];
int m,n,k,sum;
int S[20];
int F[20];
void read(){
freopen("ubuntzei.in","r",stdin);
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=k;i++)
scanf("%d",&S[i]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
A[i][j]=inf;
int x,y,c;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&c);
A[x][y]=A[y][x]=c;
}
fclose(stdin);
}
void roy_floyd(){
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
if(A[i][k]+A[k][j]<A[i][j])
A[i][j]=A[j][i]=A[i][k]+A[k][j];
}
void solve(){
int nod_pornire = 1;
int nod_destinatie = n;
int min1;
int min2;
int poz1;
int poz2;
for(int i=1;i<=k;i++){
min1=INT_MAX;
for(int j=1;j<=k;j++)
if(A[nod_pornire][S[j]]<min1 && !F[j]){
min1=A[nod_pornire][S[j]];
poz1=j;
}
min2=INT_MAX;
for(int j=1;j<=k;j++)
if(A[nod_destinatie][S[j]]<min2 && !F[j]){
min2=A[nod_destinatie][S[j]];
poz2=j;
}
if(min1<min2){
F[poz1]++;
sum+=min1;
nod_pornire=S[poz1];
if(i==k) sum+=min2;
}
else{
F[poz2]++;
sum+=min2;
nod_destinatie=S[poz2];
if(i==k && k%2) sum+=min1;
}
}
freopen("ubuntzei.out","w",stdout);
printf("%d",sum);
fclose(stdout);
}
int main(){
read();
roy_floyd();
solve();
return 0;
}