#include<bits/stdc++.h>
using namespace std;
using pii = pair<int,int>;
const int N = 2e5+5,LOG = 50;
int n,m,k,dp[N][LOG],a[N];
vector<pii> adj[N];
int main()
{
cin>>n>>k>>m;
for(int i = 0;i <= n;i++)
{
for(int j = 0;j < (1<<k);j++)
dp[i][j] = 1e9;
}
for(int i = 1;i <= k;i++)
{
cin>>a[i];
dp[a[i]][1<<(i-1)] = 0;
//pq.push({0,a[i],1<<i});
}
for(int i = 1;i <= m;i++)
{
int x,y,z;
cin>>x>>y>>z;
adj[x].push_back({y,z});
adj[y].push_back({x,z});
}
// while(!pq.empty())
for (int mask = 0; mask < (1 << k); mask++)
{
for (int submask = mask; submask; submask = (submask - 1) & mask)
{
if (submask == mask) continue;
int o = mask ^ submask;
for (int u = 1; u <= n; u++)
{
dp[u][mask] = min(dp[u][mask], dp[u][submask] + dp[u][o]);
}
}
priority_queue<pii, vector<pii>, greater<pii>> pq;
for (int u = 1; u <= n; u++) {
if (dp[u][mask] < 1e9)
pq.emplace(dp[u][mask], u);
}
while (!pq.empty()) {
auto [cost, u] = pq.top(); pq.pop();
if (dp[u][mask] != cost) continue;
for (auto [v, w] : adj[u]) {
if (dp[v][mask] > dp[u][mask] + w) {
dp[v][mask] = dp[u][mask] + w;
pq.emplace(dp[v][mask], v);
}
}
}
}
int ans = 1e9;
for(int i = 1;i <= n;i++)
{
ans = min(ans,dp[i][(1<<k)-1]);
}
cout<<ans;
}
# | 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... |