This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
const int K = 5;
long long INF;
vector<pair<int , int> > g[N];
vector<int> vec;
long long dp[N][1 << K] , ans;
int n , k , m;
bool vis[N];
void dij(int mask , int sit){
priority_queue<pair<long long , int> > pq;
for(int i = 1 ; i <= n ; i++)
if(dp[i][mask] < INF)
pq.push({-dp[i][mask] , i});
while(!pq.empty()){
int ver = pq.top().second;
pq.pop();
if(vis[ver]) continue;
vis[ver] = 1;
if(sit) ans = min(ans , dp[ver][mask]);
for(auto i : g[ver]){
int w = i.second , v = i.first;
if(dp[v][mask] > dp[ver][mask] + w){
dp[v][mask] = dp[ver][mask] + w;
pq.push({-dp[v][mask] , v});
}
}
}
for(int i = 1 ; i <= n ; i++)
vis[i] = 0;
}
int main(){
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n >> k >> m;
for(int i = 0 ; i < k ; i++){
int x;
cin >> x;
vec.push_back(x);
}
for(int i = 0 ; i < m ; i++){
int u , v , w;
cin >> u >> v >> w;
g[u].push_back({v , w});
g[v].push_back({u , w});
}
memset(dp , 63 , sizeof(dp));
ans = INF = dp[0][0];
for(int i = 0 ; i < k ; i++){
dp[vec[i]][1 << i] = 0;
dij(1 << i , 0);
}
for(int mask = 3 ; mask < (1 << k) ; mask++){
int cnt = 0;
for(int i = 0 ; i < k ; i++)
if(mask & (1 << i))
cnt++;
if(cnt == 1) continue;
for(int v = 1 ; v <= n ; v++){
for(auto j : g[v]){
int u = j.first , w = j.second , sub = mask;
while(sub){
dp[v][mask] = min(dp[v][mask] , dp[v][sub] + dp[u][mask ^ sub] + w);
sub--;
sub &= mask;
}
}
}
dij(mask , (mask == (1 << k) - 1 ? 1 : 0));
}
cout << ans << '\n';
return 0;
}
# | 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... |