Pagini recente » Cod sursa (job #2836201) | Cod sursa (job #1525940) | Cod sursa (job #1424204) | Cod sursa (job #3161567) | Cod sursa (job #1630335)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 2010;
int N, M, K;
int who[NMAX];
vector<int> G[NMAX], C[NMAX];
int DP[210][1 << 15];
int main() {
assert(freopen("ubuntzei.in", "r", stdin));
assert(freopen("ubuntzei.out", "w", stdout));
int i, j;
cin >> N >> M >> K;
memset(who, 0xff, sizeof who);
for (i = 0; i < K; ++i) {
int val;
cin >> val;
who[val] = i;
}
for (i = 1; i <= M; ++i) {
int x, y, c;
cin >> x >> y >> c;
G[x].push_back(y);
G[y].push_back(x);
C[x].push_back(c);
C[y].push_back(c);
}
memset(DP, 0x3f, sizeof DP);
DP[1][0] = 0;
priority_queue<tuple<int, int, int>, vector<tuple<int, int, int>>, greater<tuple<int, int, int>>> Q;
Q.push(make_tuple(0, 1, 0));
while (!Q.empty()) {
int curr, node, mask;
tie(curr, node, mask) = Q.top();
Q.pop();
if (node == N && mask == (1 << K) - 1) {
cout << curr << '\n';
return 0;
}
for (i = 0; i < int(G[node].size()); ++i) {
int nnode = G[node][i];
int ncost = C[node][i];
int nmask = mask;
if (who[nnode] != -1)
nmask |= (1 << who[nnode]);
if (/*DP[nnode].count(nmask) == 0 || */DP[nnode][nmask] > curr + ncost) {
DP[nnode][nmask] = curr + ncost;
Q.push(make_tuple(curr + ncost, nnode, nmask));
}
}
}
return 0;
}