10971번: 외판원 순회 2
첫째 줄에 도시의 수 N이 주어진다. (2 ≤ N ≤ 10) 다음 N개의 줄에는 비용 행렬이 주어진다. 각 행렬의 성분은 1,000,000 이하의 양의 정수이며, 갈 수 없는 경우는 0이 주어진다. W[i][j]는 도시 i에서 j
www.acmicpc.net
DFS의 문제이다. DFS이므로 backtracking에 신경쓰도록 한다. 전형적인 느낌으로 모든 지점을 방문하면서 지나간다.
무엇을 backtracking에 넣을 것인가?
각 방문했던 지점을 visited로 구분하는 것을 넣어준다. 이 부분만 신경써주면 된다.
sum은 매개변수에서 처리하기 때문에 따로 신경쓰지 않는다.
단, 중간에 거리가 0인 부분은 이동이 불가하므로 0을 만나면 그냥 return을 해준다.
//10971 외판원 순회2
import java.util.*;
public class Main {
static int N;
static int[][] array;
static boolean visited[];
static int answer=Integer.MAX_VALUE;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
array = new int[N+1][N+1];
visited = new boolean[N+1];
for(int i=1;i<=N;i++) {
for(int j=1;j<=N;j++) {
array[i][j] = sc.nextInt();
}
}
for(int i=1;i<=N;i++) {
visited[i]=true;
DFS(i,i,0,0);
visited[i]=false;
}
System.out.println(answer);
}
public static void DFS(int start, int now, int sum, int cnt) {
if(cnt==N-1) {
if(array[now][start]!=0) {
sum += array[now][start];
if(sum<answer) answer = sum;
}
return;
}
for(int i=1;i<=N;i++) {
if(visited[i]==false && array[now][i]!=0) {
visited[i]=true;
DFS(start,i,sum+array[now][i],cnt+1);
visited[i]=false;
}
}
}
}
반응형
'Algorithm' 카테고리의 다른 글
[ 백준 / 2580 ] 스도쿠 ( 자바 ) (0) | 2021.01.14 |
---|---|
[ 백준 / 1009 ] 분산처리 ( 자바 ) (0) | 2021.01.14 |
[ 백준 / 1977 ] 완전제곱수 ( 자바 ) (0) | 2021.01.14 |
[ 백준 / 1032 ] 명령 프롬프트 ( 자바 ) (0) | 2021.01.14 |
[ 백준 / 13460 ] 구슬 탈출 2 ( 자바 ) (0) | 2021.01.14 |