11403번: 경로 찾기
가중치 없는 방향 그래프 G가 주어졌을 때, 모든 정점 (i, j)에 대해서, i에서 j로 가는 경로가 있는지 없는지 구하는 프로그램을 작성하시오.
www.acmicpc.net
핵심 아이디어
해당 위치에서의 경로가 존재하는지 판단하는 문제로, 플로이드 와샬 알고리즘으로 해결할 수 있다.
플로이드 와샬 알고리즘은 dp 개녕을 깔고 들어가는데,
모든 정점to정점을 순회하되, 중간지점인 k를 두어서, k를 거쳐하는 경로가 더 짧은 경우에 matrix값을 갱신시켜주는 역할을 한다.
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const solution = function (input) {
const n = parseInt(input.shift());
const edgeMatrix = [];
const resultMatrix = Array.from({ length: n }, () =>
Array.from({ length: n }, () => Infinity)
);
for (const row of input) {
edgeMatrix.push(row.split(' ').map((e) => parseInt(e)));
}
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
if (edgeMatrix[i][j] === 0) continue;
resultMatrix[i][j] = edgeMatrix[i][j];
}
}
for (let k = 0; k < n; k++) {
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
if (resultMatrix[i][j] > resultMatrix[i][k] + resultMatrix[k][j]) {
resultMatrix[i][j] = resultMatrix[i][k] + resultMatrix[k][j];
}
}
}
}
let ans = '';
for (const row of resultMatrix) {
ans += `${row
.map((e) => {
return e === Infinity ? 0 : 1;
})
.join(' ')}\n`;
}
console.log(ans.trim('\n'));
};
const input = [];
rl.on('line', function (line) {
input.push(line);
}).on('close', function () {
solution(input);
process.exit();
});
'개발 > 알고리즘' 카테고리의 다른 글
[Javascript][BOJ] 11055 가장 큰 증가 부분 수열 (0) | 2021.01.03 |
---|---|
[Javascript][BOJ] 1956 운동 (플로이드 와샬, 사이클) (0) | 2020.12.30 |
[Javascript][BOJ] 10818 최소, 최대 (0) | 2020.12.23 |
[Javascript][BOJ] 1719 택배 (다익스트라 경로) (0) | 2020.12.20 |
[Javascript][BOJ] 14938 서강그라운드 (0) | 2020.12.20 |