728x90
반응형
목차
https://www.acmicpc.net/problem/2252
문제
문제 구현 방향
아래 위상 정렬을 참고해서 다시 구현했다.
https://charles098.tistory.com/12
[C++] 위상 정렬(Topology Sort)
위상 정렬은 비순환 단방향 그래프에서 순서가 정해져 있는 작업을 차례대로 수행해야 할 때 그 순서를 결정해주는 알고리즘이다. 순서만 맞으면 되기 때문에 정답이 두 개 이상일 수 있다. 단,
charles098.tistory.com
코드 구현
const input = require("fs")
.readFileSync("./dev/stdin", "utf-8")
.trim()
.split("\n");
class Queue {
constructor() {
this.store = new Map();
this.front = 0;
this.end = 0;
}
front() {
return this.store.get(this.front);
}
size() {
return this.store.size;
}
add(node) {
this.store.set(this.end, node);
this.end++;
}
pop() {
if (this.size() === 0) return undefined;
const item = this.store.get(this.front);
this.store.delete(this.front);
this.front++;
if (this.size() === 0) {
this.front = 0;
this.end = 0;
}
return item;
}
}
let v = Array.from({ length: 320001 }, () => []);
let ds = Array(320001).fill(0);
let queue = new Queue();
let ans = [];
function sorting() {
for (let i = 1; i <= N; i++) {
if (ds[i] === 0) queue.add(i);
}
while (queue.size()) {
let q = queue.pop();
ans.push(q);
for (let i = 0; i < v[q].length; i++) {
let a = v[q][i];
ds[a]--;
if (ds[a] === 0) {
queue.add(a);
}
}
}
}
let [N, M] = input[0].trim().split(" ").map(Number);
input.splice(0, 1);
for (let i = 0; i < input.length; i++) {
let [A, B] = input[i].trim().split(" ").map(Number);
v[A].push(B);
ds[B]++;
}
sorting();
for (let i = 0; i < ans.length; i++) {
process.stdout.write(`${String(ans[i])} `);
}
반응형
'백준 문제풀이 > Nodejs' 카테고리의 다른 글
[백준][[이분탐색] 2343 기타레슨 NodeJs 구현 (0) | 2024.11.09 |
---|---|
[백준][위상정렬] 3665 최종순위 NodeJs 구현 (0) | 2024.11.08 |
[백준][크루스칼] 1922 네트워크 연결 NodeJs 구현 (4) | 2024.11.06 |
[백준][다익스트라] 1753 최단 경로 NodeJs 구현 (3) | 2024.11.05 |
[백준][구현] 21610 마법사 상어와 피바라기 NodeJs 구현 (0) | 2024.11.04 |