From 1043e121320a01c07a77ff7e4eb4985777ca3c8e Mon Sep 17 00:00:00 2001 From: luckylooky2 Date: Tue, 21 May 2024 09:11:18 +0900 Subject: [PATCH] =?UTF-8?q?5.21:=20floyd,=20graph,=20shortest=20path(?= =?UTF-8?q?=ED=8C=8C=ED=8B=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- baekjoon/1238.js | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 baekjoon/1238.js diff --git a/baekjoon/1238.js b/baekjoon/1238.js new file mode 100644 index 0000000..c697772 --- /dev/null +++ b/baekjoon/1238.js @@ -0,0 +1,46 @@ +// 파티 : 최단 경로, 그래프 +const input = require("fs") + .readFileSync("/dev/stdin") + .toString() + .trim() + .split("\n") + .map((v) => v.split(" ").map((v) => Number(v))); +const [n, m, x] = input.shift(); +const edges = input; +const times = new Array(n + 1) + .fill(null) + .map(() => new Array(n + 1).fill(Infinity)); + +for (const [start, end, time] of edges) { + times[start][end] = time; +} + +// j -> i -> k(i -> j -> k가 아님) +for (let layover = 1; layover <= n; layover++) { + for (let start = 1; start <= n; start++) { + for (let end = 1; end <= n; end++) { + // times[layover][end] = Math.min(times[layover][end], times[layover][start] + times[start][end]); + times[start][end] = Math.min( + times[start][end], + times[start][layover] + times[layover][end] + ); + } + } +} + +let max = 0; +for (let i = 1; i <= n; i++) { + if (i === x) { + continue; + } + max = Math.max(max, times[i][x] + times[x][i]); +} + +console.log(max); + +// n이 최대 1000이기 때문에 다익스트라, 플로이드 어느 것을 사용해도 됨 + +// i -> j -> k : i에서 j를 거쳐 k로 가는 방법 +// j -> i -> k : j에서 i를 거쳐 k로 가는 방법(이게 정답, 헷갈리지 않게 주의) + +// i, j, k 대신 layover, start, end로 기억하기