Pagini recente » Cod sursa (job #357191) | Cod sursa (job #1600447) | Cod sursa (job #1870408) | Cod sursa (job #1245422) | Cod sursa (job #1916812)
#include <cstdio>
#include <vector>
#include <memory.h>
#include <algorithm>
#define NMAX 2001
#define INF 1e9
using namespace std;
int rf[NMAX][NMAX];
vector <int> friends;
int N, M, K;
FILE *f = freopen("ubuntzei.in", "r", stdin);
FILE *g = freopen("ubuntzei.out", "w", stdout);
void readData() {
scanf("%d%d", &N, &M);
scanf("%d", &K);
for(int i = 1; i<=N; i++)
for(int j = 1; j<=N; j++)
rf[i][j] = INF;
for(int i = 0; i<K; i++) {
int x;
scanf("%d", &x);
friends.push_back(x);
}
for(int i = 1;i<=M; i++) {
int x, y, cost;
scanf("%d%d%d", &x, &y, &cost);
rf[x][y] = rf[y][x] = cost;
}
}
void royFloyd() {
for(int k = 1; k<=N; k++) {
for(int i = 1; i<=N; i++) {
for(int j = 1; j<=N; j++)
rf[i][j] = min(rf[i][j], rf[i][k] + rf[k][j]);
}
}
}
void solve() {
royFloyd();
if(K > 0) {
sort(friends.begin(), friends.end());
int ans = INF;
do {
int temp = rf[1][friends.front()] + rf[friends.back()][N];
for(int i = 0; i<friends.size() - 1; i++)
temp += rf[friends[i]][friends[i + 1]];
ans = min(ans, temp);
}while(next_permutation(friends.begin(), friends.end()));
printf("%d", ans);
}
else printf("%d", rf[1][N]);
}
int main() {
readData();
solve();
}