제출 #1291066

#제출 시각아이디문제언어결과실행 시간메모리
1291066Jawad_Akbar_JJCities (BOI16_cities)C++20
100 / 100
3585 ms43548 KiB
#include <iostream> #include <set> #include <vector> using namespace std; #define int long long const int N = 1<<17; vector<pair<int,int>> nei[N]; int Mn[32][N], sp[5], n, m, k, Ans = 1e17; void dijkstra(int s, int str){ set<pair<int,int>> st; if (s != -1){ Mn[str][s] = 0; st.insert({0, s}); } else{ for (int i=1;i<=n;i++) st.insert({Mn[str][i], i}); } while (st.size() > 0){ auto [mn, u] = *begin(st); st.erase(begin(st)); for (auto [i, w] : nei[u]){ if (Mn[str][i] > mn + w){ st.erase({Mn[str][i], i}); Mn[str][i] = mn + w; st.insert({Mn[str][i], i}); } } } } signed main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin>>n>>k>>m; for (int i=0;i<k;i++) cin>>sp[i]; for (int i=1;i<=m;i++){ int a, b, c; cin>>a>>b>>c; nei[a].push_back({b, c}); nei[b].push_back({a, c}); } for (int i=0;i<=n;i++){ for (int j=1;j<32;j++) Mn[j][i] = 1e17; } for (int i=1, id = 0;i<(1<<k);i++){ if (__builtin_popcount(i) == 1){ dijkstra(sp[id++], i); continue; } for (int u=1;u<=n;u++){ for (auto [v, w] : nei[u]) for (int msk = i; msk; msk = (msk - 1) & i) Mn[i][u] = min(Mn[i][u], Mn[msk][v] + w + Mn[i ^ msk][u]); } dijkstra(-1, i); } for (int i=1;i<=n;i++) Ans = min(Ans, Mn[(1<<k) - 1][i]); cout<<Ans<<'\n'; }
#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...