문제
18352번: 특정 거리의 도시 찾기
첫째 줄에 도시의 개수 N, 도로의 개수 M, 거리 정보 K, 출발 도시의 번호 X가 주어진다. (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N) 둘째 줄부터 M개의 줄에 걸쳐서 두 개
www.acmicpc.net
풀이
주어진 도로와 도시 정보에서 모든 도시간의 거리가 1이라는 점을 이용해 너비 우선 탐색(BFS)으로 해결할 수 있다.
시작 도시로부터 BFS를 수행하며 거리를 계산하고 거리 배열에 저장해준다. 여기서 모든 도시간의 거리가 1이기 때문에 도시에 처음 도착했을 때의 거리가 최단 거리일 것이다. 탐색이 끝난 후 찾으려는 거리에 도시가 있다면 도시를 출력해주고, 없다면 -1을 출력한다.
코드
import java.util.*
fun main() {
val br = System.`in`.bufferedReader()
val bw = System.out.bufferedWriter()
val st = StringTokenizer(br.readLine())
val city = st.nextToken().toInt()
val road = st.nextToken().toInt()
val street = st.nextToken().toInt()
val first = st.nextToken().toInt()
val distance = IntArray(city + 1){ -1 }
val graph = ArrayList<ArrayList<Int>>()
repeat(city+1){ graph.add(ArrayList()) }
repeat(road) {
with(StringTokenizer(br.readLine())) {
graph[nextToken().toInt()].add(nextToken().toInt())
}
}
fun bfs() {
val queue : Queue<Int> = LinkedList()
queue.offer(first)
while (queue.isNotEmpty()) {
val now = queue.poll()
for(next in graph[now]) {
if(distance[next] == -1) {
distance[next] = distance[now] + 1
queue.add(next)
}
}
}
}
distance[first] = 0
bfs()
val sb = StringBuilder()
var check = false
for(i in 1 .. city) {
if(distance[i] == street) {
check = true
sb.append("$i\n")
}
}
bw.write(if(check) sb.toString() else "-1")
bw.flush()
bw.close()
br.close()
}
'알고리즘 > Baekjoon' 카테고리의 다른 글
[백준] 4485번: 녹색 옷 입은 애가 젤다지? - Kotlin[코틀린] (0) | 2023.11.30 |
---|---|
[백준] 2529번: 부등호 - Kotlin[코틀린] (0) | 2023.11.29 |
[백준] 17472번: 다리 만들기 2 - Kotlin[코틀린] (0) | 2023.11.24 |
[백준] 6479번: 전력난 - Kotlin[코틀린] (0) | 2023.11.22 |
[백준] 1774번: 우주신과의 교감 - Kotlin[코틀린] (0) | 2023.11.20 |