728x90
https://www.acmicpc.net/problem/10971
10971번: 외판원 순회 2
첫째 줄에 도시의 수 N이 주어진다. (2 ≤ N ≤ 10) 다음 N개의 줄에는 비용 행렬이 주어진다. 각 행렬의 성분은 1,000,000 이하의 양의 정수이며, 갈 수 없는 경우는 0이 주어진다. W[i][j]는 도시 i에서 j
www.acmicpc.net
문제 풀이
1. 첫번째 도시 부터 N 번째 도시까지 하나씩 출발 도시로 선택한다.
2. dfs 를 이용하여 순회여행 경비의 최소값을 찾는다.
2-1. dfs 인자로 N(도시의 개수), VISIT(방문 도시 여부), W(도시 이동 비용), depth(방문한 도시 개수), sum(현재까지의 비용 총합) 넘겨 준다.
2-2. 1번 탐색 시 출발도시를 first 변수에 저장한다.
2-3. tspResult 값을 Int.MAX_VALUE 로 초기 설정 한다.
3. dfs 로 탐색하여 나온 결과 중 최소값을 찾는다. 이때 dfs 과정에서 W[start][[i] 가 0 인 경우 도로가 연결되지 않은 도시이므로 방문하지 않는다.
코드
import java.io.*
var tspResult = Int.MAX_VALUE
var first = 0
fun main(args: Array<String>) {
val br = BufferedReader(InputStreamReader(System.`in`))
val N = br.readLine().toInt()
val W = Array(N + 1) {
IntArray(N + 1) {
0
}
}
val visit = BooleanArray(N + 1) {
false
}
repeat(N) {
val arr = br.readLine().split(" ").map { it.toInt() }.toIntArray()
arr.forEachIndexed { index, a ->
W[it + 1][index + 1] = a
}
}
visit[0] = true
for (i in 1..N) {
first = i
visit[i] = true
dfs(N, i, W, visit, 1, 0)
}
println(tspResult)
}
fun dfs(n: Int, start: Int, w: Array<IntArray>, visit: BooleanArray, depth: Int, sum: Int) {
if (depth >= n && w[start][first] != 0) {
//println("${w[start][first]}, $tspResult")
tspResult = Math.min(tspResult, sum + w[start][first])
return
}
for (i in 1..n) {
if (!visit[i]) {
//println("start $start, i $i, sum $sum depth $depth")
visit[i] = true
if (w[start][i] != 0) {
dfs(n, i, w, visit, depth + 1, sum + w[start][i])
}
visit[i] = false
}
}
}
728x90
'알고리즘(w.KOTLIN) > 탐색' 카테고리의 다른 글
[백준][KOTLIN][14501] 퇴사 (0) | 2023.02.03 |
---|---|
[백준][KOTLIN][1759] 암호 만들기 (0) | 2023.02.02 |
[백준][KOTLIN][10819] 차이를 최대로 (0) | 2023.02.01 |
[백준][KOTIN][10972] 다음 순열 (0) | 2023.01.26 |
[백준][1748][KOTLIN] 수 이어 쓰기1 (0) | 2023.01.19 |