Pagini recente » Cod sursa (job #1470921) | Cod sursa (job #521456) | Cod sursa (job #986793) | Cod sursa (job #2813143) | Cod sursa (job #2534694)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream cin ("ubuntzei.in");
ofstream cout ("ubuntzei.out");
int n, m, k, x, y, z;
int loc[20], ind[2005];
vector <pair <int, int>> g[2005];
int dp[2005][32770];
int main() {
cin >> n >> m >> k;
for(int i = 1; i <= k; i++)
cin >> loc[i];
sort(loc + 1, loc + k + 1);
for(; m; m--) {
cin >> x >> y >> z;
g[x].push_back({y, z});
g[y].push_back({x, z});
}
for(int i = 1; i <= n; i++) {
for(int j = 0; j < (1 << k); j++)
dp[i][j] = (int)1e9;
}
dp[1][0] = 0;
int p = 1;
for(int i = 1; i <= n; i++) {
if(loc[p] == i)
ind[i] = p - 1, p++;
else
ind[i] = k;
}
for(int j = 0; j < (1 << k); j++) {
int p = 0;
for(int i = 1; i <= n; i++) {
if(j & (1 << ind[i])) {
for(auto &son : g[i])
dp[i][j] = min(dp[i][j], dp[son.first][j ^ (1 << (i - 1))] + son.second);
} else {
for(auto &son : g[i])
dp[i][j] = min(dp[i][j], dp[son.first][j] + son.second);
}
}
}
cout << dp[n][(1 << k) - 1];
return 0;
}