Sightseeing

NOI 2014 (finals)hardgraphdp
Time: O(V + E)
Space: O(V + E)
View original problem

Solution

C++
// https://codebreaker.xyz/problem/sightseeing
#include<bits/stdc++.h>
using namespace std;
int main(){
  ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  int v,e,q; cin>>v>>e>>q;
  vector<pair<int,int>> g[v]; // {w,v}
  for(int i=0;i<e;++i){
    int u,v,w; cin>>u>>v>>w; --u,--v;
    g[u].emplace_back(w,v);
    g[v].emplace_back(w,u);
  }
  int di[v]; memset(di,0,sizeof di); di[0]=INT32_MAX;
  priority_queue<pair<int,int>> pq; // {d,u}
  pq.emplace(di[0],0);
  while(pq.size()){
    auto[d,u]=pq.top(); pq.pop();
    if(d<di[u]) continue;
    for(auto&[w,v]:g[u]){
      int nd=min(d,w);
      if(nd<=di[v]) continue;
      pq.emplace(di[v]=nd,v);
    }
  }
  while(q--){
    int x; cin>>x;
    cout<<di[--x]<<'\n';
  }
  return 0;
}

Editorial

Editorial coming soon.