Pagini recente » Cod sursa (job #1739144) | Cod sursa (job #1850118) | Cod sursa (job #1850095) | Cod sursa (job #921011) | Cod sursa (job #2534738)
#include <fstream>
#include <vector>
#include <queue>
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 distS[2005], distL[20][2005], dp[32770][20];
void bfs(int nod, int dist[]) {
for(int i = 1; i <= n; i++)
dist[i] = (int)1e9;
queue <int> q;
dist[nod] = 0;
q.push(nod);
while(!q.empty()) {
nod = q.front();
q.pop();
for(auto &son : g[nod]) {
if(dist[nod] + son.second < dist[son.first]) {
dist[son.first] = dist[nod] + son.second;
q.push(son.first);
}
}
}
}
int main() {
cin >> n >> m >> k;
for(int i = 1; i <= k; i++)
cin >> loc[i];
for(; m; m--) {
cin >> x >> y >> z;
g[x].push_back({y, z});
g[y].push_back({x, z});
}
bfs(1, distS);
for(int i = 1; i <= k; i++)
bfs(loc[i], distL[i]);
if(!k) {
cout << distS[n];
return 0;
}
for(int i = 1; i < (1 << k); i++) {
for(int j = 1; j <= k; j++) {
if(i & (1 << (j - 1))) {
if((i ^ (1 << (j - 1))) == 0)
dp[i][j] = distS[loc[j]];
else {
for(int l = 1; l <= k; l++)
dp[i][j] = min(dp[i][j], dp[i ^ (1 << (j - 1))][l] + distL[l][loc[j]]);
}
}
}
}
int ans = (int)1e9;
for(int i = 1; i <= k; i++)
ans = min(ans, dp[(1 << k) - 1][i] + distL[i][n]);
cout << ans;
return 0;
}