公式

D - 最安経路 / Cheapest Route 解説 by physics0523


この問題は標準的な最短経路問題です。
問題文の指示通りグラフを構築し、空港のある都市全てを距離 \(0\) として最短経路問題を解けばよいです。

実装例ではダイクストラ法を用いています。

実装例 (C++):

#include<bits/stdc++.h>

using namespace std;
using ll=long long;
using pl=pair<ll,ll>;
using Graph=vector<vector<pl>>;

int main(){
  ll N,K,P;
  cin >> N >> K >> P;
  vector<ll> M(N);
  for(auto &nx : M){cin >> nx;}
  Graph g(N);
  for(ll i=0;i<K;i++){
    ll U,V;
    cin >> U >> V;
    U--; V--;
    g[U].push_back({V,M[U]*M[V]});
    g[V].push_back({U,M[U]*M[V]});
  }
  vector<ll> d(N,4e18);
  priority_queue<pl,vector<pl>,greater<pl>> pq;
  for(ll i=0;i<P;i++){
    ll E;
    cin >> E;
    E--;
    d[E]=0;
    pq.push({0,E});
  }
  while(!pq.empty()){
    auto od=pq.top(); pq.pop();
    if(od.second==0){
      cout << od.first << "\n";
      return 0;
    }
    if(d[od.second]!=od.first){continue;}
    for(auto &nx : g[od.second]){
      if(d[nx.first]>od.first+nx.second){
        d[nx.first]=od.first+nx.second;
        pq.push({d[nx.first],nx.first});
      }
    }
  }
  return 0;
}

投稿日時:
最終更新: