티스토리 뷰

https://www.acmicpc.net/problem/11657

 

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

 

밸만포드 알고리즘

=> 노드 수 -1 만큼 반복하면서 간선들을 확인.

=> 마지막에 한번 더 체크  (음의 사이클 확인) 

 

 

const fs = require('fs');
const input = fs.readFileSync("./dev/stdin").toString().trim().split("\n").map(str => str.split(' ').map(Number));
const [N, M] = input.shift();
let cost = new Array(N + 1).fill(Infinity);
cost[1] = 0;

let answer = [];

for (let i = 0; i < N - 1; i++) {
  let change = false
  input.forEach(v => {
    const [A, B, C] = v;
    if (A !== Infinity && cost[A] + C < cost[B]) {
      cost[B] = cost[A] + C;
      change = true;
    }
  })
  if (!change) break;
}

answer = cost.slice(2, cost.length).map(v => {
  if (v === Infinity) return -1;
  return v;
}).join('\n');


let check = false;
for (let i = 0; i < M; i++) {
  const [A, B, C] = input[i];
  if (A !== Infinity && cost[A] + C < cost[B]) {
    cost[B] = cost[A] + C;
    check = true;
  }
  if (check) answer = -1;
}

console.log(answer)
728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함