JavaScriptでワーシャルフロイド法を実装

JavaScriptでワーシャルフロイド法を実装

2020-06-219 min read

目次

  1. 概要
  2. atcoder-abc012-d問題
  3. 実装

概要

AtCoder ABC012 の D問題でワーシャルフロイド法が利用できる問題が出てきたので、 JavaScriptで実装しました。

AtCoder ABC012 D問題

D - バスと避けられない運命

問題内容を簡潔に表現すると

ルール

N M
a1 b1 t1
a2 b2 t2
:
aM bM tM
  • N ( 2 <= N <= 300 )
  • M ( N-1 <= M <= 44850 )
  • ai,bi ( 1 <= ai,bi <= N )
  • ti (1 <= ti <= 1000)
  • ai != bi

ai と bi は座標を表しており、ti は ai と bi 間の距離である。

求めたいものは ある一つの選択した座標から自身以外の他の全ての座標までの距離を求めその中から最長の物を選ぶ。 この最長の距離がM個の座標の中で最も小さくなるようなものを答えとして出力する。

サンプル

入力値が次の場合を考える。

3 2
1 2 10
2 3 10

1から2までの距離は10、1から3までの距離は20、2から3までの距離は10となる。

よって2を選択したときに最大の距離が10となるため、10を出力する。

解説

実装

'use strict';
function main(arg) {
  let tmp = arg.trim().split('\n').map(e => e.split(' ').map(Number));
  const V = tmp[0][0];
  const E = tmp[0][1];
  tmp.shift();
  let data = tmp;

  const MAX = 10e9;
  let graph = Array.from(new Array(V), () => new Array(V).fill(MAX));

  for (let i = 0; i < data.length; i++) {
    let a = data[i][0] - 1;
    let b = data[i][1] - 1;
    let t = data[i][2];
    graph[a][b] = t;
    graph[b][a] = t;
  }

  // ワーシャルフロイド
  for (let k = 0; k < V; k++) {
    for (let i = 0; i < V; i++) {
      for (let j = 0; j < V; j++) {
        graph[i][j] = Math.min(graph[i][j], graph[i][k] + graph[k][j]);
        if (i === j) {
          graph[i][j] = 0;
        }
      }
    }
  }

  // console.log(JSON.stringify(graph,null,' '));

  let ans = 10e9;
  let max_temp = 0;

  for (let i = 0; i < V; i++) {
    for (let j = 0; j < V; j++) {
      if (max_temp < graph[i][j]) {
        max_temp = graph[i][j];
      }
    }
    if (ans > max_temp) {
      ans = max_temp;
    }
    max_temp = 0;
  }

  console.log(ans);
}
main(require('fs').readFileSync('/dev/stdin', 'utf8'));

入力値が

3 2
1 2 10
2 3 10

だった場合、 ワーシャルフロイドで計算された変数graphは次のようになる。

[[20, 10, 20], [10, 20, 10], [20, 10, 20]]

この2次元配列の行の中の最大値が一番小さいものを求めればOK

Tags
javascript(110)
node.js(54)
linux(54)
amazon%20aws(47)
typescript(45)
%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0(36)
%E7%94%BB%E5%83%8F%E5%87%A6%E7%90%86(30)
html5(29)
php(24)
centos(24)
python(22)
%E7%AB%B6%E6%8A%80%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0(21)
mac(21)
mysql(20)
canvas(19)
opencv(17)
%E9%9B%91%E8%AB%87(16)
docker(16)
wordpress(15)
atcoder(14)
apache(12)
%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92(12)
%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9(12)
amazon%20s3(12)
red%20hat(12)
prisma(12)
ubuntu(11)
github(10)
git(10)
vue.js(10)
%E7%94%BB%E5%83%8F%E5%87%A6%E7%90%86100%E6%9C%AC%E3%83%8E%E3%83%83%E3%82%AF(10)
mariadb(10)
react(9)
aws%20cdk(9)
css3(8)
%E5%8F%AF%E8%A6%96%E5%8C%96(8)
%E5%B0%8F%E3%83%8D%E3%82%BF(8)
nestjs(8)
amazon%20lightsail(7)
next.js(7)
%E3%83%96%E3%83%AD%E3%82%B0(6)
cms(6)
oracle(6)
perl(6)
gitlab(6)
iam(5)
amazon%20ec2(5)
%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93(5)
aws%20amplify(5)
curl(4)
Author
githubzennqiita
ただの備忘録です。

※外部送信に関する公表事項