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>
#define x first
#define y second
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pii;
const int MAXN = 1e5 + 10;
ll n, m, kk;
vector<pii> k[MAXN];
ll di[MAXN][40];
int main(){
ios_base::sync_with_stdio(false), cin.tie(0);
cin >> n >> kk >> m;
for(int i=0; i<=n; i++)
for(int j=0; j<40; j++)
di[i][j] = 1e16;
priority_queue<pair<ll, pii>, vector<pair<ll, pii>>, greater<pair<ll, pii>>> q;
for(int i=0; i<kk; i++){
int cu; cin >> cu;
di[cu][1<<i] = 0;
q.push({0, {cu, 1<<i}});
}
for(int i=0; i<m; i++){
ll fr, to, co; cin >> fr >> to >> co;
k[fr].pb({to, co});
k[to].pb({fr, co});
}
while(!q.empty()){
auto x = q.top();
q.pop();
//cout << x.y.x << " " << bitset<3>(x.y.y) << " " << x.x << endl;
if(x.x > di[x.y.x][x.y.y]) continue;
for(auto u : k[x.y.x]){
if(di[u.x][x.y.y] > x.x + u.y){
di[u.x][x.y.y] = x.x + u.y;
q.push({x.x+u.y, {u.x, x.y.y}});
}
}
for(int i=1; i<(1<<kk); i++){
if((i & x.y.y) == 0){
//cout << i << " " << x.y.y << endl;
int nm = i | x.y.y;
if(di[x.y.x][nm] > x.x + di[x.y.x][i]){
di[x.y.x][nm] = x.x + di[x.y.x][i];
q.push({di[x.y.x][nm], {x.y.x, nm}});
}
}
}
}
ll ans = 1e16;
for(int i=1; i<=n; i++)
ans = min(ans, di[i][(1<<kk)-1]);
cout << ans << endl;
}
# | 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... |