寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

AtCoder Problems in C++ #F - 船旅

第7回日本情報オリンピック 予選(過去問)から、その提出コードの解答例です。
AtCoderとは、コンテストを通じて、プログラミングやアルゴリズムを学習するサービスです。
atcoder.jp
プログラミングコンテストとは、「与えられた問題をいかに素早く、正確に」解くことができるかを競うものです。
競技プログラミング」を略して、「競プロ」などと呼ばれています。

#F - 船旅

atcoder.jp

僕が作成、提出したコードは、以下のとおりです。

/*
AtCoder Problems in C++
#F - 船旅
https://atcoder.jp/contests/joi2008yo/tasks/joi2008yo_f
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
#define INF 100000000
using p=pair<int,int>;
vector<p> vp[110];
int n;
int dijkstra(int i,int j){
  vector<int> v(n,INF);
  v[i]=0;
  priority_queue<p,vector<p>,greater<p>> q;
  q.push({0,i});
  while(!(q.empty())){
    p pp=q.top();
    q.pop();
    int num=pp.second;
    for(auto x : vp[num]){
      if(v[num]+x.first<v[x.second]){
        v[x.second]=v[num]+x.first;
        q.push({v[x.second],x.second});
      }
    }
  }
  if(v[j]==INF){
    return -1;
  }else{
    return v[j];
  }
}
int main(void){
  int k;
  cin>>n>>k;
  for(int i=0;i<k;i++){
    int j;
    cin>>j;
    if(j==0){
      int a,b;
      cin>>a>>b;
      cout<<dijkstra(a-1,b-1)<<endl;
    }else{
      int a,b,c;
      cin>>a>>b>>c;
      vp[a-1].push_back({c,b-1});
      vp[b-1].push_back({c,a-1});
    }
  }
  return 0;
}