제출 #107693

#제출 시각아이디문제언어결과실행 시간메모리
107693KepperoniCities (BOI16_cities)C++14
74 / 100
6013 ms78720 KiB
#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]; bool vis[MAXN][40]; int main(){ ios_base::sync_with_stdio(false), cin.tie(0), cout.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; queue<pii> q; for(int i=0; i<kk; i++){ int cu; cin >> cu; di[cu][1<<i] = 0; q.push({cu, 1<<i}); vis[cu][1<<i] = 1; } 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.front(); q.pop(); vis[x.x][x.y] = 0; ll cdi = di[x.x][x.y]; //cout << x.y.x << " " << bitset<3>(x.y.y) << " " << x.x << endl; int oma = ~x.y; int i = 0; while(i < (1<<kk)){ int a = i ^ oma; a = a & -a; i ^= a; i &= -a; //cout << i << " " << x.y.y << endl; int nm = i | x.y; if(di[x.x][nm] > cdi + di[x.x][i]){ di[x.x][nm] = cdi + di[x.x][i]; if(!vis[x.x][nm]){ vis[x.x][nm] = 1; q.push({x.x, nm}); } } } for(auto u : k[x.x]){ if(di[u.x][x.y] > cdi + u.y){ di[u.x][x.y] = cdi + u.y; if(!vis[u.x][x.y]){ vis[u.x][x.y] = 1; q.push({u.x, x.y}); } } } } ll ans = 1e16; for(int i=1; i<=n; i++) ans = min(ans, di[i][(1<<kk)-1]); cout << ans << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...