Pagini recente » Cod sursa (job #2827614) | Cod sursa (job #2669868) | Cod sursa (job #2254566) | Cod sursa (job #815066) | Cod sursa (job #2861453)
#include <bits/stdc++.h>
using namespace std;
inline void Open(const string Name) {
#ifndef ONLINE_JUDGE
(void)!freopen((Name + ".in").c_str(), "r", stdin);
(void)!freopen((Name + ".out").c_str(), "w", stdout);
#endif
}
void solve() {
int n, m; cin >> n >> m;
int k; cin >> k;
vector <int> C{0};
for(int i = 1;i <= k;i++) {
C.emplace_back(0);
cin >> C[i];
--C[i];
}
++k; ++k;
C.emplace_back(n - 1);
vector <vector <pair <int, int>>> adj(n);
while(m--) {
int a, b, c; cin >> a >> b >> c;
--a, --b;
adj[a].emplace_back(b, c);
adj[b].emplace_back(a, c);
}
const int INF = 1e9;
function <void(int, vector <int>&)> dijkstra = [&](int s, vector <int>& dist) {
for(int i = 0;i < n;i++) {
dist[i] = INF;
}
priority_queue <pair <int, int>, vector <pair <int, int>>, greater <pair <int, int>>> q;
q.emplace(0, s);
dist[s] = 0;
while(!q.empty()) {
int d_v = q.top().first;
int v = q.top().second;
q.pop();
if(d_v != dist[v]) {
continue;
}
for(auto& it : adj[v]) {
int to = it.first;
int cost = it.second;
if(dist[v] + cost < dist[to]) {
dist[to] = dist[v] + cost;
q.emplace(dist[to], to);
}
}
}
};
vector <vector <int>> dist(k, vector <int>(n));
for(int i = 0;i < k;i++) {
dijkstra(C[i], dist[i]);
}
vector <vector <int>> dp(1 << k, vector <int>(k, INF));
dp[1][0] = 0;
for(int i = 0;i < (1 << k);i++) {
for(int j = 0;j < k;j++) {
if(!(i & (1 << j))) {
continue;
}
for(int l = 0;l < k;l++) {
dp[i][l] = min(dp[i][l], dp[i ^ (1 << l)][j] + dist[j][C[l]]);
}
}
}
cout << dp[(1 << k) - 1][k - 1];
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
Open("ubuntzei");
int T = 1;
for(;T;T--) {
solve();
}
return 0;
}