코딩 테스트/알고리즘
[백준] 10971 외판원 순회2(Sliver. 2) - DFS
토자맨
2024. 8. 15. 17:35
문제
코드
- 비슷한 유형의 문제: 숫자고르기
단순하게 모든 경로의 비용을 구한 뒤 최소 비용을 출력하면 풀리는 문제이다. DFS(백트래킹)으로 모든 경로를 구한 뒤 최솟값을 출력하는 방식으로 풀었다.
- 풀이 방법
- 시작 도시를 지정하여 dfs로 모든 경로를 탐색한다.
- 모든 도시를 탐색했다면 비용을 지금까지 구한 최소 비용과 비교하여 더 작다면 최소 비용으로 업데이트한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class _10971_외판원_순회2 {
static int[][] costSet;
static boolean[] visited;
static int minCost = Integer.MAX_VALUE;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
costSet = new int[n][n];
visited = new boolean[n];
for (int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < n; j++)
costSet[i][j] = Integer.parseInt(st.nextToken());
}
for (int i = 0; i < n; i++) {
visited[i] = true;
dfs(i, i, 0, 1, n);
visited[i] = false;
}
System.out.println(minCost);
}
public static void dfs(int start, int nowNode, int cost, int cnt, int n) {
if (cnt == n && costSet[nowNode][start] != 0) {
minCost = Math.min(minCost, cost + costSet[nowNode][start]);
return;
}
for (int i = 0; i < n; i++) {
if (!visited[i] && costSet[nowNode][i] != 0) {
visited[i] = true;
dfs(start, i, cost + costSet[nowNode][i], cnt + 1, n);
visited[i] = false;
}
}
}
}