Pagini recente » Cod sursa (job #884870) | Cod sursa (job #715847) | Cod sursa (job #1019880) | Cod sursa (job #2721007) | Cod sursa (job #1367469)
#include <vector>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAX_N = 2002;
const int MAX_K = 15;
const int INF = 0x3f3f3f3f;
int N, M, K;
int D[MAX_N][(1 << (MAX_K + 1)) + 2], a[MAX_N];
vector < pair < int, int > > v[MAX_N];
queue < pair < int, int > > Q;
int main() {
freopen("ubuntzei.in", "r", stdin);
freopen("ubuntzei.out", "w", stdout);
scanf("%d %d %d", &N, &M, &K);
for(int i = 1; i <= N; ++i)
a[i] = -1;
for(int i = 1; i <= K; ++i) {
int x;
scanf("%d", &x);
a[x] = i - 1;
}
for(int i = 1; i <= M; ++i) {
int x, y, c;
scanf("%d %d %d", &x, &y, &c);
v[x].push_back(make_pair(y, c));
v[y].push_back(make_pair(x, c));
}
memset(D, INF, sizeof(D));
int conf = 0;
if(a[1] != -1)
conf ^= (1 << a[1]);
D[1][conf] = 0;
Q.push(make_pair(1, conf));
while(!Q.empty()) {
int x = Q.front().first, conf = Q.front().second;
Q.pop();
for(int i = 0; i < v[x].size(); ++i) {
int y = v[x][i].first, c = v[x][i].second, conf1 = conf;
if(a[y] != -1 && (conf1 & (1 << a[y])) == 0)
conf1 ^= (1 << a[y]);
if(D[x][conf] + c < D[y][conf1]) {
D[y][conf1] = D[x][conf] + c;
Q.push(make_pair(y, conf1));
}
}
}
printf("%d\n", D[N][(1 << K) - 1]);
return 0;
}