알고리즘/백준
백준 node.js 11657번 타임머신 벨만-포드 알고리즘 JavaScript JS
kku_lurgi
2023. 7. 21. 06:48
11657번: 타임머신
첫째 줄에 도시의 개수 N (1 ≤ N ≤ 500), 버스 노선의 개수 M (1 ≤ M ≤ 6,000)이 주어진다. 둘째 줄부터 M개의 줄에는 버스 노선의 정보 A, B, C (1 ≤ A, B ≤ N, -10,000 ≤ C ≤ 10,000)가 주어진다.
www.acmicpc.net
기본적인 밸만 포드 알고리즘 문제입니다.
각 노드에서 모든 간선을 순회하며 모든 노드를 순회하는 O^2의 시간복잡도를 가집니다.
정확하게는 출발노드를 제외한 N-1개의 노드에서 E개의 간선을 순회하여 NE의 시간복잡도를 가집니다
문제풀이
let fs = require('fs');
let input = fs.readFileSync('/dev/stdin').toString().trim().split("\\n")
// 도시의 개수 N, 버스 노선의 개수 M
const [N,M] = input[0].split(" ").map(Number);
// 모든 간선들을 roads 배열에 넣기
const roads = [];
for(let i=1; i<=M; i++){
const [str,end,time] = input[i].split(" ").map(Number)
roads.push({str,end,time})
}
// 밸만-포드 알고리즘
const timeArr = Array.from({length : N+1}, () => Infinity)
timeArr[1] = 0;
for(let i=1; i<=M; i++){
for(let {str,end,time} of roads){
if(timeArr[str] + time < timeArr[end]){
timeArr[end] = timeArr[str] + time
}
}
}
let pass = true;
A : for(let i=1; i<=M; i++){
for(let {str,end,time} of roads){
if(timeArr[str] + time < timeArr[end]){
pass = false;
break A;
}
}
}
if(pass){
console.log(timeArr.slice(2).map(v => v === Infinity ? -1 : v).join("\\n"))
}else console.log(-1)