Pagini recente » Cod sursa (job #51033) | Cod sursa (job #1543591) | Cod sursa (job #991642) | Cod sursa (job #1875158) | Cod sursa (job #903364)
Cod sursa(job #903364)
#include <cstdio>
#include <climits>
#define nMax 2005
#define kMax 20
#define Inf INT_MAX
int N, M, K;
int A[nMax][nMax];
int C[kMax];
void Read(){
scanf("%d %d\n", &N, &M);
for(int i=1; i<=N; i++)
for(int j=1; j<=N; j++)
i-j ? A[i][j] = Inf : A[i][j] = 0;
scanf("%d ", &K);
for(int i=1; i<=K; i++)
scanf("%d ", &C[i]);
C[0] = 1;
C[K+1] = N;
int x, y, c;
for(int i=1; i<=M; i++){
scanf("%d %d %d\n", &x, &y, &c);
A[x][y] = A[y][x] = c;
}
}
bool S[nMax];
void Dijkstra(int Start){
for(int i=1; i<=N; i++)
S[i] = false;
// A[Start][i] - Dijkstra (Start) -> [i]
S[Start] = true;
int nodMinim;
int costMinim;
for(int i=1; i<=N-1; i++){
costMinim = Inf;
for(int j=1; j<=N; j++)
if(A[Start][j] < costMinim && !S[j]){
nodMinim = j;
costMinim = A[Start][j];
}
S[nodMinim] = true;
for(int j=1; j<=N; j++)
if(A[Start][j] > A[nodMinim][j] + costMinim && !S[j] && A[nodMinim][j] != Inf)
A[Start][j] = A[nodMinim][j] + costMinim;
}
}
int St[kMax];
int F[kMax];
int bestSum = Inf;
int Sum = 0;
void back(int k){
for(int i=1; i<=K; i++){
if(!F[i]){
St[k] = i;
F[i]++;
Sum += A[C[St[k-1]]][C[St[k]]];
if(Sum + A[C[St[k]]][C[St[k+1]]] < bestSum) //if(valid(k))
if(k==K) //if(solutie)
bestSum = Sum + A[C[St[k]]][C[St[k+1]]];
else back(k+1);
F[i]--;
Sum -= A[C[St[k-1]]][C[St[k]]];
}
}
}
int main(){
freopen("ubuntzei.in", "r", stdin);
freopen("ubuntzei.out", "w", stdout);
Read();
Dijkstra(1);
for(int i=1; i<=K; i++)
Dijkstra(C[i]);
if(!K){
printf("%d", A[1][N]);
return 0;
}
St[0] = 0;
St[K+1] = K+1;
back(1);
printf("%d", bestSum);
return 0;
}