Pagini recente » Cod sursa (job #2166891) | Cod sursa (job #969460) | Cod sursa (job #1527879) | Cod sursa (job #2150924) | Cod sursa (job #1367503)
#include <vector>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAX_N = 2002;
const int MAX_K = 17;
const int INF = 0x3f3f3f3f;
int N, M, K, ans = INF;
int D[MAX_K][MAX_N], dp[MAX_K][(1 << MAX_K) + 2], w[MAX_K];
vector < pair < int, int > > v[MAX_N];
queue < int > Q;
void BF(int ind, int x) {
D[ind][x] = 0;
Q.push(x);
while(!Q.empty()) {
int x = Q.front();
Q.pop();
for(int i = 0; i < (int) v[x].size(); ++i) {
int y = v[x][i].first, c = v[x][i].second;
if(D[ind][x] + c < D[ind][y]) {
D[ind][y] = D[ind][x] + c;
Q.push(y);
}
}
}
}
int main() {
freopen("ubuntzei.in", "r", stdin);
freopen("ubuntzei.out", "w", stdout);
scanf("%d %d %d", &N, &M, &K);
w[1] = 1;
++K;
for(int i = 2; i <= K; ++i) {
scanf("%d", &w[i]);
if(w[i] == 1) {
--K;
--i;
}
}
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));
for(int i = 1; i <= K; ++i)
BF(i, w[i]);
memset(dp, INF, sizeof(dp));
dp[1][1] = 0;
for(int conf = 2; conf < (1 << K); ++conf) {
for(int i = 1; i <= K; ++i) {
for(int j = 1; j <= K; ++j) {
if(conf & (1 << (j - 1)) && dp[j][conf ^ (1 << (i - 1))] + D[j][w[i]] < dp[i][conf])
dp[i][conf] = dp[j][conf ^ (1 << (i - 1))] + D[j][w[i]];
}
}
}
for(int i = 1; i <= K; ++i)
if(dp[i][(1 << K) - 1] + D[i][N] < ans)
ans = dp[i][(1 << K) - 1] + D[i][N];
printf("%d\n", ans);
return 0;
}