본문 바로가기
Algorithm/백준

특정한 최단 경로 1504 javascript

by eclipse7727 2022. 6. 29.
 

1504번: 특정한 최단 경로

첫째 줄에 정점의 개수 N과 간선의 개수 E가 주어진다. (2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000) 둘째 줄부터 E개의 줄에 걸쳐서 세 개의 정수 a, b, c가 주어지는데, a번 정점에서 b번 정점까지 양방향 길이 존

www.acmicpc.net

 

다익스트라로 푸는 문제

다만 자바스크립트로 풀려면 우선순위 큐를 직접 구현해야한다.

 

const fs = require("fs");
const stdin = (
  process.platform === "linux"
    ? fs.readFileSync("/dev/stdin").toString()
    : `4 6
    1 2 3
    2 3 3
    3 4 1
    1 3 5
    2 4 5
    1 4 4
    2 3`
).split("\n");

const input = (() => {
  let line = 0;
  return () => stdin[line++];
})();

class PriorityQueue {
  constructor() {
    this.queue = [];
  }
  enqueue(qElement) {
    let isContain = false;
    for (let i = 0; i < this.queue.length; i++) {
      if (this.queue[i][0] > qElement[0]) {
        this.queue.splice(i, 0, qElement);
        isContain = true;
        break;
      }
    }
    if (!isContain) {
      this.queue.push(qElement);
    }
  }
  dequeue() {
    if (!this.isEmpty()) return this.queue.shift();
  }
  isEmpty() {
    return this.queue.length === 0;
  }
}

const [N, E] = input()
  .trim()
  .split(" ")
  .map((v) => +v);
// console.log(N, E);
const arr = new Array(N + 1).fill(null).map((_) => new Array());
for (let i = 0; i < E; i++) {
  const [a, b, c] = input()
    .trim()
    .split(" ")
    .map((v) => +v);
  arr[a].push([b, c]);
  arr[b].push([a, c]);
}

const [v1, v2] = input()
  .trim()
  .split(" ")
  .map((v) => +v);

// console.log(arr);

const pq = new PriorityQueue();
const dijkstra = (startVertex) => {
  const dp = new Array(N + 1).fill(Infinity);
  dp[startVertex] = 0;
  pq.enqueue([0, startVertex]);
  while (!pq.isEmpty()) {
    const [pqW, pqV] = pq.dequeue();
    for (let [arrV, arrW] of arr[pqV]) {
      const totalW = pqW + arrW;
      if (totalW < dp[arrV]) {
        dp[arrV] = totalW;
        pq.enqueue([totalW, arrV]);
      }
    }
  }
  return dp;
};

const resStart = dijkstra(1);
const resV1 = dijkstra(v1);
const resV2 = dijkstra(v2);

const result = Math.min(
  resStart[v1] + resV1[v2] + resV2[N],
  resStart[v2] + resV2[v1] + resV1[N]
);
if (result === Infinity) {
  console.log(-1);
} else {
  console.log(result);
}
반응형

'Algorithm > 백준' 카테고리의 다른 글

백준 1253번 좋다 python  (0) 2022.07.01
백준 도서관 1461 python  (0) 2022.06.30
백준 최소비용 구하기 성공 1916 javascript  (0) 2022.06.30
콘센트 23843 python  (0) 2022.06.29
Puyo Puyo  (0) 2022.06.22

댓글