๐ ๋ฌธ์
๋ฐฉํฅ๊ทธ๋ํ๊ฐ ์ฃผ์ด์ง๋ฉด ์ฃผ์ด์ง ์์์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ์ผ๋ก์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ๋จ, ๋ชจ๋ ๊ฐ์ ์ ๊ฐ์ค์น๋ 10 ์ดํ์ ์์ฐ์์ด๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ ์ ์ ๊ฐ์ V์ ๊ฐ์ ์ ๊ฐ์ E๊ฐ ์ฃผ์ด์ง๋ค. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) ๋ชจ๋ ์ ์ ์๋ 1๋ถํฐ V๊น์ง ๋ฒํธ๊ฐ ๋งค๊ฒจ์ ธ ์๋ค๊ณ ๊ฐ์ ํ๋ค. ๋์งธ ์ค์๋ ์์ ์ ์ ์ ๋ฒํธ K(1 ≤ K ≤ V)๊ฐ ์ฃผ์ด์ง๋ค. ์ ์งธ ์ค๋ถํฐ E๊ฐ์ ์ค์ ๊ฑธ์ณ ๊ฐ ๊ฐ์ ์ ๋ํ๋ด๋ ์ธ ๊ฐ์ ์ ์ (u, v, w)๊ฐ ์์๋๋ก ์ฃผ์ด์ง๋ค. ์ด๋ u์์ v๋ก ๊ฐ๋ ๊ฐ์ค์น w์ธ ๊ฐ์ ์ด ์กด์ฌํ๋ค๋ ๋ป์ด๋ค. u์ v๋ ์๋ก ๋ค๋ฅด๋ฉฐ w๋ 10 ์ดํ์ ์์ฐ์์ด๋ค. ์๋ก ๋ค๋ฅธ ๋ ์ ์ ์ฌ์ด์ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ์ด ์กด์ฌํ ์๋ ์์์ ์ ์ํ๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค๋ถํฐ V๊ฐ์ ์ค์ ๊ฑธ์ณ, i๋ฒ์งธ ์ค์ i๋ฒ ์ ์ ์ผ๋ก์ ์ต๋จ ๊ฒฝ๋ก์ ๊ฒฝ๋ก๊ฐ์ ์ถ๋ ฅํ๋ค. ์์์ ์์ ์ 0์ผ๋ก ์ถ๋ ฅํ๊ณ , ๊ฒฝ๋ก๊ฐ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ์๋ INF๋ฅผ ์ถ๋ ฅํ๋ฉด ๋๋ค.
์ ์ถ๋ ฅ ์
์์ ์ ๋ ฅ | ์์ ์ถ๋ ฅ |
5 6 1 5 1 1 1 2 2 1 3 3 2 3 4 2 4 5 3 4 6 |
0 2 3 7 INF |
โ๏ธ ํ์ด
๋ค์ต์คํธ๋ผ๋ฅผ ์ด์ฉํด์ ํ์๋ค. ์ต๊ทผ ๋ค์ต์คํธ๋ผ ๋ฌธ์ ๋ฅผ ํ์๋ ์ ์ด ์๋๋ฐ ๊ทธ๋๋ ํ์ ์ฌ์ฉํ์ง ์์์๋ค. ์ด๋ฒ์ ๋ฌธ์ ๋ฅผ ํ๋ฉด์ console.log๋ฅผ ์ต์ํํ๊ฑฐ๋, get, set์ ์ต์ ํ๋ฅผ ์ํด ์์น์ ๋ณด๋ฅผ ์ ์ฅํ๋ graph(์๋ ์ฝ๋ ์ dist)๋ฅผ ์ผ๋ฐ ๊ฐ์ฒด๊ฐ ์๋ Map์ ์ด์ฉํ๊ฑฐ๋ ํด๋ ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ๊ณ ๊ฒฐ๊ตญ ํ์ ์ฌ์ฉํ๊ฒ ๋์๋ค.
๊ธฐ๋ณธ์ ์ธ ๋ก์ง์ ๋ค์ต์คํธ๋ผ์ ๋์ผํ๋ค. ํ๋์ ์ถ๋ฐ์ ์์ ๋ค๋ฅธ ๋ชจ๋ ๋ ธ๋๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ ์ ์๋๋ก ๋ฐฐ์ด(visited)์ ์ฌ์ฉํด์ ํ์ฌ ๋ฐฉ๋ฌธ ์ค์ธ ๋ ธ๋์์ ๋ค๋ฅธ ๋ ธ๋๋ก ์ด๋ํ ๋ ์ต์์ ๋ฃจํธ๋ฅผ ๋ณ๋์ ๋ฐฐ์ด(costs)์์ ์ต์ ํํ๋ค. ์ ์ผํ ์ฐจ์ด์ ์ด ๋ค์์ผ๋ก ๋ฐฉ๋ฌธํ ๋ ธ๋๋ฅผ ์ ํ๋ ๋ถ๋ถ์ธ๋ฐ ํ์ ์ฌ์ฉํ์ง ์์ ๋๋ ๋ชจ๋ ๋ ธ๋๋ฅผ ํ์ํ๋ฉด์ ๋ฐฉ๋ฌธํ์ง ์๋ ๋ ธ๋ ์ค ๊ฐ์ฅ ์ต์์ ๋น์ฉ์ด ๋๋ ๋ ธ๋๋ก ๊ณจ๋ผ์ ์ด๋ํ์๋ค. ํ์ ์ฌ์ฉํ์ ๋๋ ๊ฑฐ๋ฆฌ์์ผ๋ก ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ์ ๋ ธ๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค. ์ด ๋ถ๋ถ์์ ์๊ฐ๋ณต์ก๋ n์์ LogN์ผ๋ก ์ค๋ฉฐ ์๊ฐ์ด๊ณผ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ๊ฒ ๊ฐ๋ค.
โจ๏ธ ์ฝ๋
const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './testcase/1753.txt';
let inputs = fs.readFileSync(filePath).toString().trim().split('\n');
inputs = inputs.map(str => str.split(' ').map(Number));
class MinHeap {
constructor() {
this.heap = [];
this.heap.push(-1e9);
}
insert(value) {
this.heap.push(value);
this.upheap(this.heap.length - 1);
}
upheap(pos) {
let temp = this.heap[pos];
while (temp[1] < this.heap[parseInt(pos / 2)][1]) {
this.heap[pos] = this.heap[parseInt(pos / 2)];
pos = parseInt(pos / 2);
}
this.heap[pos] = temp;
}
get() {
if (this.size() === 0) return 0;
if (this.size() === 1) return this.heap.pop();
const result = this.heap[1];
this.heap[1] = this.heap.pop();
this.downheap(1, this.heap.length - 1);
return result;
}
downheap(pos, len) {
let temp = this.heap[pos],
child;
while (pos <= parseInt(len / 2)) {
child = pos * 2;
if (child < len && this.heap[child][1] > this.heap[child + 1][1]) child++;
if (temp[1] <= this.heap[child][1]) break;
this.heap[pos] = this.heap[child];
pos = child;
}
this.heap[pos] = temp;
}
size() {
return this.heap.length - 1;
}
}
const [V, E] = inputs[0];
const start = inputs[1][0];
const costs = new Array(V + 1).fill(Infinity);
const visited = new Array(V + 1).fill(0);
const dists = [...Array(V + 1)].map(_ => new Array());
for (let i = 2; i < inputs.length; i++) {
const [u, v, w] = inputs[i];
dists[u].push([v, w]);
}
costs[start] = 0;
const heap = new MinHeap();
heap.insert([start, 0]);
while (heap.size() > 0) {
const [pos, dist] = heap.get();
if (visited[pos]) continue;
visited[pos] = true;
for (let [next, dist] of dists[pos]) {
if (costs[next] <= costs[pos] + dist) continue;
costs[next] = dist + costs[pos];
heap.insert([next, costs[next]]);
}
}
const answer = [];
for (let i = 1; i <= V; i++) answer.push(costs[i] === Infinity ? 'INF' : costs[i]);
console.log(answer.join('\n'));
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Algorithm] ๋ก๋ (๋ฐฑ์ค - 6603) (0) | 2023.05.24 |
---|---|
[Algorithm] ๋ฌผํต (๋ฐฑ์ค - 2251) (0) | 2023.05.22 |
[Algorithm] 1ํ๋ (๋ฐฑ์ค - 5557) (1) | 2023.05.16 |
[Algorithm] ์ต์ ๋น์ฉ ๊ตฌํ๊ธฐ (๋ฐฑ์ค - 1916) (0) | 2023.05.09 |
[Algorithm] ๋์ 2 (๋ฐฑ์ค - 2294) (0) | 2023.05.08 |