11403번: 경로 찾기백준/문제2024. 5. 9. 02:50
Table of Contents
문제 출처 : https://www.acmicpc.net/problem/11403
언어 : Kotlin
문제 설명 :
가중치 없는 방향 그래프 G가 주어졌을 때, 모든 정점 (i, j)에 대해서, i에서 j로 가는 길이가 양수인 경로가 있는지 없는지 구하는 프로그램을 작성하시오.
입력 :
첫째 줄에 정점의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄부터 N개 줄에는 그래프의 인접 행렬이 주어진다. i번째 줄의 j번째 숫자가 1인 경우에는 i에서 j로 가는 간선이 존재한다는 뜻이고, 0인 경우는 없다는 뜻이다. i번째 줄의 i번째 숫자는 항상 0이다.
출력 :
총 N개의 줄에 걸쳐서 문제의 정답을 인접행렬 형식으로 출력한다. 정점 i에서 j로 가는 길이가 양수인 경로가 있으면 i번째 줄의 j번째 숫자를 1로, 없으면 0으로 출력해야 한다.
제한 사항 :
- 시간 제한 : 1초
- 메모리 제한 : 256MB
입출력 예 :
입력 | 출력 |
3 0 1 0 0 0 1 1 0 0 |
1 1 1 1 1 1 1 1 1 |
7 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 |
1 0 1 1 1 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 1 1 1 1 1 0 0 1 0 0 0 1 0 0 1 0 0 0 0 |
풀이 :
그래프, 정점, 인접행렬.
플로이드 워셜 알고리즘 문제이다.
https://small-stepping.tistory.com/599
DFS와 BFS로도 풀 수 있다.
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
val bw = BufferedWriter(OutputStreamWriter(System.out))
val n = readLine().toInt()
val dp = Array(n) { intArrayOf() }
repeat(n) {
dp[it] = readLine().split(" ").map { it.toInt() }.toIntArray()
}
floydMarshall(n, dp)
dp.forEach {
bw.appendLine(it.joinToString(" "))
bw.flush()
}
bw.close()
}
fun floydMarshall(n: Int, dp: Array<IntArray>) {
for (k in 0 until n) {
for (i in 0 until n) {
for (j in 0 until n) {
if (dp[i][k] == 1 && dp[k][j] == 1) dp[i][j] = 1
}
}
}
}
'백준 > 문제' 카테고리의 다른 글
1253번: 좋다 (0) | 2024.05.10 |
---|---|
20529번: 가장 가까운 세 사람의 심리적 거리 (0) | 2024.05.09 |
6064번: 카잉 달력 (0) | 2024.05.09 |
1036번: 36진수 (0) | 2024.05.08 |
30501번: 관공... 어찌하여 목만 오셨소... (0) | 2024.05.08 |
@스몰스테핑 :: 작은 발걸음
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!