#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
const long long INF=1e18;
long long dp[36][MAXN],pos[36];
priority_queue< pair<long long,int>,vector< pair<long long,int> >,greater< pair<long long,int> > > pq;
vector< pair<int,int> > ds[MAXN];
int getlog(long long n) { return 63-__builtin_clzll(n); }
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,k,m;
cin>>n>>k>>m;
for(int i=0;i<k;i++) cin>>pos[i];
for(int i=1;i<=m;i++)
{
int l,r,v;
cin>>l>>r>>v;
ds[l].push_back({r,v}),ds[r].push_back({l,v});
}
for(int i=1;i<(1<<k);i++)
{
for(int j=1;j<=n;j++) dp[i][j]=INF;
if(__builtin_popcount(i)==1) dp[i][pos[getlog(i)]]=0;
else for(int j=(i-1)&i;j;j=(j-1)&i) for(int k=1;k<=n;k++) dp[i][k]=min(dp[i][k],dp[j][k]+dp[i-j][k]);
for(int j=1;j<=n;j++) pq.push({dp[i][j],j});
while(!pq.empty())
{
long long a=pq.top().first,b=pq.top().second;
pq.pop();
if(dp[i][b]<a) continue;
for(auto v:ds[b]) if(dp[i][v.first]>a+v.second) pq.push({dp[i][v.first]=a+v.second,v.first});
}
}
long long ans=INF;
for(int i=1;i<=n;i++) ans=min(ans,dp[(1<<k)-1][i]);
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... |