백준 10971: 외판원 순회2(Java)

less than 1 minute read

문제링크 : https://www.acmicpc.net/problem/10971

문제

img1

img2

문제를 해결한 방법

TSP 문제의 대표적인 외판원 순회입니다. N의 값이 10 이하이기 때문에 DFS + 백트래킹으로 풀이했습니다.

소스 코드

package baek;

import java.io.*;
import java.util.*;

public class Main_10971_외판원순회2 {
	static int N, MIN;
	static int[][] graph;
	static boolean[] visit;
	
	public static void TSP(int start, int prev, int depth, int sum) {
		if(depth == N-1) {
			if(graph[prev][start] == 0)
				return;
			MIN = Math.min(MIN, sum+ graph[prev][start]);
			return;
		}
		
		for(int next=0;next<N;next++) {
			if(!visit[next] && graph[prev][next] != 0) {
				visit[next] = true;
				TSP(start, next, depth+1, sum + graph[prev][next]);
				visit[next] = false;
			}
		}
	}
	
	public static void main(String[] args) throws Exception{
		BufferedReader br  = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());
		graph = new int[N][N];
		MIN = Integer.MAX_VALUE;
		visit = new boolean[N];
		
		for(int i=0;i<N;i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			for(int j=0;j<N;j++) {
				graph[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		for(int i=0;i<N;i++) {
			visit[i] = true;
			TSP(i, i, 0, 0);
			visit[i] = false;
		}
		
		if(MIN == Integer.MAX_VALUE) {
			System.out.println(0);
		}else {
			System.out.println(MIN);
		}
	}
}

Categories:

Updated:

Comments