10423번: 전기가 부족해
첫째 줄에는 도시의 개수 N(1 ≤ N ≤ 1,000)과 설치 가능한 케이블의 수 M(1 ≤ M ≤ 100,000)개, 발전소의 개수 K(1 ≤ K ≤ N)개가 주어진다. 둘째 줄에는 발전소가 설치된 도시의 번호가 주어진다. 셋째
www.acmicpc.net
핵심아이디어.
최소 스패닝 트리의 크루스칼 알고리즘을 사용하면 된다.
다만, 특별한 점이 있다면 각 노드들이 발전소가 있는 도시와 일반도시로 나누어 진다는 것이다.
일반 도시들은 발전소에서 전기를 끌어와야 하므로, 모든 발전소 도시들의 미리 union으로 묶어놓고
크루스칼/유니온파인드 알고리즘을 사용하면 된다.
<javascript />
'use strict'
const readline = require("readline");
const {
appendFile
} = require("fs");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const findParent = (parents, target) => {
if (parents[target] !== target) {
parents[target] = findParent(parents, parents[target]);
}
return parents[target];
}
const union = (parents, a, b) => {
a = findParent(parents, a);
b = findParent(parents, b);
if (a, b) {
parents[b] = a;
} else {
parents[a] = b;
}
return parents;
}
const solution = function (input) {
const [n, m, k] = input.shift().split(" ").map(elem => parseInt(elem))
const powerPlants = input.shift().split(" ").map(elem => parseInt(elem));
const edges = [];
let parents = [...new Array(n + 1)].map((_, idx) => idx);
let res = 0;
for (const edge of input) {
const [u, v, w] = edge.split(" ").map(elem => parseInt(elem));
edges.push([u, v, w]);
}
// 발전소끼리는 모두 union으로 묶어준다.
for (let i = 0; i < powerPlants.length - 1; i++) {
const powerPlant = powerPlants[i];
const nextPowerPlant = powerPlants[i + 1];
parents = union(parents, powerPlant, nextPowerPlant);
}
edges.sort((a, b) => a[2] - b[2]);
// console.log(edges);
edges.forEach((edge) => {
const [u, v, w] = edge;
if (findParent(parents, u) !== findParent(parents, v)) {
// console.log();
// console.log(findParent(parents, u), findParent(parents, v))
parents = union(parents, u, v);
// console.log(u, v);
res += w;
}
});
// console.log(parents);
console.log(res);
};
const input = [];
rl.on("line", function (line) {
input.push(line);
}).on("close", function () {
solution(input);
process.exit();
});
한번 누르면 2시간동안 보이지 않아요 ㅎㅎ
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
원치 않을 경우 를 눌러주세요
'개발 > 알고리즘' 카테고리의 다른 글
[Javascript][BOJ] 2606 바이러스 (dfs) (0) | 2020.12.05 |
---|---|
[Javascript][BOJ] 14950 정복자 (0) | 2020.12.05 |
[Javascript][BOJ] 1766 문제집 (위상정렬/우선순위 큐) (0) | 2020.12.03 |
[Javascript][BOJ] 1920 수 찾기 (0) | 2020.12.01 |
[Javascript][BOJ] 1789 수들의 합 (0) | 2020.12.01 |