제출 #1271527

#제출 시각아이디문제언어결과실행 시간메모리
1271527rayan_bdCities (BOI16_cities)C++20
0 / 100
177 ms18876 KiB
#include <bits/stdc++.h> using namespace std; const int mxN = 1e5 + 100; #define int long long const int inf = 1e18; vector<pair<int, int>> adj[mxN]; map<int, vector<int>> mp; int mark[mxN]; void djikstra(int u, int n){ vector<int> dist(n + 1, inf); priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; dist[u] = 0; pq.push({0, u}); while(pq.size()){ auto tp = pq.top(); pq.pop(); if(dist[tp.second] < tp.first) continue; for(auto it : adj[tp.second]){ if(dist[it.first] > tp.first + it.second){ dist[it.first] = tp.first + it.second; pq.push({dist[it.first], it.first}); } } } mp[u] = dist; } signed main(){ ios_base::sync_with_stdio(0); cin.tie(nullptr); cout.tie(nullptr); int n, k, m, u, v, w; cin >> n >> k >> m; for(int i = 1; i <= k; ++i){ cin >> mark[i]; } for(int i = 1; i <= m; ++i){ cin >> u >> v >> w; adj[u].push_back({v, w}); adj[v].push_back({u, w}); } for(int i = 1; i <= k; ++i){ djikstra(mark[i], n); } assert(k <= 3); if(k == 2){ cout << mp[mark[1]][mark[2]] << "\n"; }else{ int ans = inf; for(int i = 1; i <= k; ++i){ int middle = mark[i]; int a = 0, b = 0; if(i == 1) a = mark[2], b = mark[3]; if(i == 2) a = mark[1], b = mark[3]; if(i == 3) a = mark[1], b = mark[2]; ans = min(ans, mp[middle][a] + mp[middle][b]); } cout << ans << "\n"; } return 0; }
#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...