[백준/JAVA] 10971번: 외판원 순회 2
🔺 문제
10971번: 외판원 순회 2
첫째 줄에 도시의 수 N이 주어진다. (2 ≤ N ≤ 10) 다음 N개의 줄에는 비용 행렬이 주어진다. 각 행렬의 성분은 1,000,000 이하의 양의 정수이며, 갈 수 없는 경우는 0이 주어진다. W[i][j]는 도시 i에서 j
www.acmicpc.net
🔺 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
import java.util.*;
import java.io.*;
public class Main {
static int N;
static int[][] map;
static boolean[] visited;
static int min;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
map = new int[N][N];
for(int i = 0 ; i < N ; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for(int j = 0 ; j < N ; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
min = Integer.MAX_VALUE;
visited = new boolean[N];
for(int i = 0 ; i < N ; i++) { // 모든 도시를 출발지로 지정해 dfs 한 번씩 수행
visited[i] = true;
tsp(i, i, 0, 0);
}
System.out.println(min);
}
private static void tsp(int start, int now, int sum, int cnt) { // 시작 도시, 현재 도시, 총 비용, 깊이
if(cnt == N - 1) {
// 맨 마지막 노드 → 맨 처음 노드 루트 존재하는 경우
if(map[now][start] != 0) {
sum += map[now][start];
min = Math.min(min, sum);
}
return;
}
for(int i = 0 ; i < N ; i++) {
// 도시 i를 방문한 적 없고, 도시 i로 가는 루트가 존재하는 경우
if(!visited[i] && map[now][i] != 0) {
visited[i] = true;
tsp(start, i, sum + map[now][i], cnt + 1);
visited[i] = false;
}
}
}
}
|
cs |
✅ 해결 아이디어
✔ 백트래킹 (외판원 순회, TSP)
- [인자로 가져갈 값] ① 시작점 도시, ② 현재 도시, ③ 합, ④ 수행 횟수
- 방문한 적 없고, 비용이 양수인 경우에만 해당하는 도시를 방문하고 재귀적으로 진행
💥 유의사항
• 모든 노드 방문한 경우 ⇨ 처음 노드는 위에서부터 방문했으므로 N - 1
• 모든 도시를 출발지로 지정해 dfs 한 번씩 수행 (출발점 지정 안 했으므로)
• "한 번 방문했던 도시는 다시 방문할 수 없다." => 방문 여부 체크
🔺 다른 풀이들
- 다들 비슷하심
💬 느낀 점
우와 백트래킹 감 잡았다고 생각했는데 경기도 오산이었다.....
쉽지 않구나...
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
(참고)
[백준] 10971번 외판원 순회 2 - Java, 자바
실버2https://www.acmicpc.net/problem/10971백트래킹을 이용해서 문제를 해결할 수 있다. 백트래킹 메소드의 매개변수를 활용하여 값을 더해준다.모든 노드를 방문한 경우 sum의 값을 구해서 가장 작은 sum
velog.io
[백준] 10971 : 외판원 순회 2 (JAVA)
문제 > BOJ 10971 : 외판원 순회 2 - https://www.acmicpc.net/problem/10971 풀이 Traveling Salesman problem(TSP), 외판원 순회의 기본적인 문제이다. DFS로 풀이하면 되는 문제! 모든 지점을 방문하
velog.io
백준 10971번 : 외판원 순회 2 (Java)
🔗 문제 링크 10971번: 외판원 순회 2 첫째 줄에 도시의 수 N이 주어진다. (2 ≤ N ≤ 10) 다음 N개의 줄에는 비용 행렬이 주어진다. 각 행렬의 성분은 1,000,000 이하의 양의 정수이며, 갈 수 없는 경우
today-retrospect.tistory.com
- 그림 과정 포함
[백준 10971번] 외판원 순회 2 (java)
10971번: 외판원 순회 2 첫째 줄에 도시의 수 N이 주어진다. (2 ≤ N ≤ 10) 다음 N개의 줄에는 비용 행렬이 주어진다. 각 행렬의 성분은 1,000,000 이하의 양의 정수이며, 갈 수 없는 경우는 0이 주어진다
lotuslee.tistory.com