#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = 1e18;
ll n, m, k;
ll a[10];
vector<pair<ll,ll>> vt[100009];
ll kq[1<<10][100009]; // k <= 10
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> k >> m;
for(int i = 1; i <= k; i++) cin >> a[i];
for(int i = 1; i <= m; i++){
ll u, v, c;
cin >> u >> v >> c;
vt[u].push_back({v, c});
vt[v].push_back({u, c});
}
// init DP
for(int mask = 0; mask < (1<<k); mask++)
for(int i = 1; i <= n; i++)
kq[mask][i] = INF;
// khởi tạo 1-bit mask: từ đỉnh đặc biệt đến chính nó
for(int i = 0; i < k; i++)
kq[1<<i][a[i+1]] = 0;
// Floyd-Warshall kiểu all-pairs trên subset 1-bit
// hoặc dùng Dijkstra cho từng subset (nhiều cách)
// DP trên tất cả subset
for(int mask = 1; mask < (1<<k); mask++){
// merge subset con
for(int sub = mask; sub; sub = (sub-1)&mask){
ll other = mask ^ sub;
if(other == 0) continue; // chỉ merge khi other != 0
for(int u = 1; u <= n; u++){
if(kq[sub][u] == INF) continue;
for(auto [v, cost] : vt[u]){
if(kq[other][v] == INF) continue;
kq[mask][v] = min(kq[mask][v], kq[sub][u] + cost + kq[other][v]);
}
}
}
// optional: Dijkstra/Floyd để "lan tỏa" DP trong mask
// nếu muốn dùng edge đi qua nhiều đỉnh trung gian
priority_queue<pair<ll,int>, vector<pair<ll,int>>, greater<pair<ll,int>>> pq;
for(int i = 1; i <= n; i++)
if(kq[mask][i] != INF)
pq.push({kq[mask][i], i});
while(!pq.empty()){
auto [d, u] = pq.top(); pq.pop();
if(d != kq[mask][u]) continue;
for(auto [v,c] : vt[u]){
if(kq[mask][v] > d + c){
kq[mask][v] = d + c;
pq.push({kq[mask][v], v});
}
}
}
}
ll res = INF;
for(int i = 1; i <= n; i++)
res = min(res, kq[(1<<k)-1][i]);
cout << res << "\n";
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |