Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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
Archives
Today
Total
관리 메뉴

전공공부

[BOJ_10971] 외판원 순회 2 본문

Study/Problem Solving

[BOJ_10971] 외판원 순회 2

monitor 2023. 10. 5. 21:02

설명


순열의 형태로 나아갔는데 사실 이런 것을 생각하고 코드를 짜지는 않았다. 솔직히 파악이 힘들어서 다른 블로그의 코드를 1차로 본 후 다시 풀어보았다. 

 

코드에 대한 설명은 아래와 같다.

 

방문 여부 체크는 다시 되돌아가지 않는다는 조건이 있었기 때문에 사용하였고, 최초 출발점인 0로 부터 시작하여 go 함수 내부 for문의 1부터 시작하여 순회를 돌며 갈 수 있는 포인트를 모두 탐색을 진행한다. 그리고, 1(이미 처음 부터 출발지 하나 선택 완료 됌) 부터 카운팅하여 N 개 까지 탐색 했다는 것은 이미 모두 돌았다는 말이니 여기서 부터 돌아갈 수 있는 포인트로 처음 시작 점으로의 가는 비용 더하고 종료하였다.

 

코드


package backtracking;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BOJ_10971 {
    static int N;
    static int w[][];
    static int ans;

    static boolean visited[];
    public static void main(String[] args) throws Exception{
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer tk = new StringTokenizer(in.readLine()," ");

        N = Integer.parseInt(tk.nextToken());

        w = new int[N][N];

        ans = Integer.MAX_VALUE;



        for(int i = 0; i < N; i++){
            tk = new StringTokenizer(in.readLine()," ");
            for(int j = 0; j < N; j++) {
                w[i][j] = Integer.parseInt(tk.nextToken());
            }
        }
        visited = new boolean[N];
        visited[0] = true;
        go(0, 0, 1);

        System.out.println(ans);

    }
    private static void go(int idx,int sum,int cnt) {
        if(cnt == N && w[0][idx] != 0){
            ans = Math.min(ans, sum + w[0][idx]);
            return;
        }else if(cnt >= N){
            return;
        }
        for(int i = 0; i < N; i++){
            if(!visited[i] && w[i][idx] != 0){
                visited[i] = true;
                go(i,sum + w[i][idx],cnt+1);
                visited[i] = false;
            }
        }
    }
}
 

10971번: 외판원 순회 2

첫째 줄에 도시의 수 N이 주어진다. (2 ≤ N ≤ 10) 다음 N개의 줄에는 비용 행렬이 주어진다. 각 행렬의 성분은 1,000,000 이하의 양의 정수이며, 갈 수 없는 경우는 0이 주어진다. W[i][j]는 도시 i에서 j

www.acmicpc.net

 

'Study > Problem Solving' 카테고리의 다른 글

[BOJ_16987] 계란으로 계란치기  (0) 2023.10.09
[BOJ_14888] 연산자 끼워넣기  (0) 2023.10.08
[BOJ_1789] 수들의 합  (1) 2023.10.04
[BOJ_1182] 부분수열의 합  (1) 2023.10.04
[BOJ_15664] N과 M (9~12)  (1) 2023.10.03