3615 -- Cow Hurdles

http://acm.pku.edu.cn/JudgeOnline/problem?id=3615
N 個の駅があり,M 本の一方通行の道が繋いでいて,それぞれの道には高さ H_i のハードルがあるとする.
駅 A_i から駅 B_i まで行くとき,途中で越えなければならないハードルの最大の高さの最小値を出力せよという問題.
もし A_i から B_i までの経路が存在しない場合は -1 を出力する.


いわゆる最短経路問題のひとつ.
複数の駅のペア間の最小値を問われるので,任意の2ノード間の最短経路を求めることができる Warshall-Floyd 法というアルゴリズムで解いた.
http://ja.wikipedia.org/wiki/%E3%83%AF%E3%83%BC%E3%82%B7%E3%83%A3%E3%83%AB-%E3%83%95%E3%83%AD%E3%82%A4%E3%83%89%E6%B3%95
Wikipedia を見ながら実装.アイデアはシンプルでわかりやすいと思う.

#include <iostream>
#include <vector>
#include <limits>
using namespace std;

vector<vector<int> > floyd(const vector<vector<int> >& g, const vector<vector<int> >& w)
{
  const int N = g.size();
  vector<vector<int> > dist(N+1, vector<int>(N+1, numeric_limits<int>::max()));
  for (int i = 1; i <= N; i++) {
    for (int j = 0; j < g[i].size(); j++) {
      const int to = g[i][j];
      dist[i][to] = w[i][j];
    }
  }

  for (int k = 1; k <= N; k++) {
    for (int i = 1; i <= N; i++) {
      for (int j = 1; j <= N; j++) {
        dist[i][j] = min(dist[i][j], max(dist[i][k], dist[k][j]));
      }
    }
  }
  return dist;
}

int main()
{
  int N, M, T;
  cin >> N >> M >> T;
  vector<vector<int> > g(N+1);
  vector<vector<int> > w(N+1);
  for (int i = 0; i < M; i++) {
    int s, e, h;
    cin >> s >> e >> h;
    g[s].push_back(e);
    w[s].push_back(h);
  }

  const vector<vector<int> > dist = floyd(g, w);
  for (int i = 0; i < T; i++) {
    int a, b;
    cin >> a >> b;
    int c = dist[a][b];
    if (c == numeric_limits<int>::max()) {
      cout << -1 << endl;
    } else {
      cout << c << endl;
    }
  }
  return 0;
}