Submission #1289302

#TimeUsernameProblemLanguageResultExecution timeMemory
1289302nikulidCities (BOI16_cities)C++20
0 / 100
358 ms20580 KiB
#include <bits/stdc++.h> using namespace std; bool debug=0; #define dout if(debug)cout #define ll long long #define pb push_back #define mp make_pair int main(){ int n,k,m; cin>>n>>k>>m; vector<int> ks(k); for(int i=0; i<k; i++){ cin>>ks[i]; --ks[i]; } vector<vector<pair<int, int>>> adj(n); int u,v,c; for(int i=0; i<m; i++){ cin>>u>>v>>c; --u;--v; adj[u].pb({v,c}); adj[v].pb({u,c}); } dout<<"--input done--\n"; // case where k <= 3 // in the ideal configuration, there exists a node such that each important city has a direct path to that node vector<vector<int>> dist(n, vector<int>(k,-1)); // we must do dijkstra to get the min dist from each node to each important city priority_queue<pair<int, int>> q; int cur_node, cur_dist; vector<vector<int>> ddist(n, vector<int>(k,-1)); for(int i=0; i<k; i++){ // do dijkstra from the k-th important city dout<<"--pushing to q--\n"; q.push({0, ks[i]}); while(!q.empty()){ cur_dist = -(q.top().first); cur_node = q.top().second; q.pop(); if(ddist[cur_node][i] != -1) continue; // already visitted dout<<"--not continued--\n"; ddist[cur_node][i] = cur_dist; for(pair<int, int> p:adj[cur_node]){ if(ddist[p.first][i] == -1){ q.push({-(cur_dist+p.second), p.first}); } } } dout<<"--dijkstra for "<<i<<"-th important city is done!\n"; } // dijkstra should be done.. dout<<"--dijkstra done--\n"; // for k <= 3 it's just finding the node with minimum sum of distances int best_sum=0, cur_sum; for(int j=0; j<k; j++){ best_sum += ddist[0][j]; } for(int i=1; i<n; i++){ cur_sum=0; for(int j=0; j<k; j++){ cur_sum += ddist[i][j]; } if(cur_sum < best_sum){ dout<<"new best sum at node "<<i<<": "<<cur_sum<<"!\n"; best_sum = cur_sum; } } cout<<best_sum<<"\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...