728x90

http://jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=954&sca=3030

 

JUNGOL

 

www.jungol.co.kr


풀이 방법

N이 작기 때문에 모든 방법을 다 해보는 완전탐색이 가능하다. 따라서 DFS를 이용해 모든 경로를 탐색하며 최소 거리를 구했다. 

시간을 줄이기 위해 구한 최소거리보다 지금 가고있는 거리가 더 크다면, 그 방법은 구하지 않았다. (if(cnt+map[r][i]>=min) continue;)

또한, 마지막으로 방문한 곳 -> 1로 가는 거리를 구할 때 그래프가 연결되어있지 않다면 거리를 구하지 않아야 한다. 

 

자바 코드

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

public class Jungol_1681_해밀턴순환회로 {
	static StringTokenizer st;
	static int N;
	static int[][] map;
	static boolean visited[];
	static int min;
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());
		map=new int[N+1][N+1];
		for (int i = 1; i < N+1; i++) {
			st=new StringTokenizer(br.readLine());
			for (int j = 1; j < N+1; j++) {
				map[i][j]=Integer.parseInt(st.nextToken());
			}
		}
		min=Integer.MAX_VALUE;
		
		// start는 1부터 
		visited=new boolean[N+1];
		dfs(1,0,0);
		
		if (min==Integer.MAX_VALUE) System.out.println(0);
		else System.out.println(min);

	}
	private static void dfs(int r,int cnt,int c) {
		if (c==N-1) {
			// 마지막으로 방문한곳 -> 1 이 연결되어 있을 때 
			if(map[r][1]!=0) {
				cnt+=map[r][1];
				min=min>cnt?cnt:min;
				cnt-=map[r][1];
			}
			return;
		}
		if (r!=1) visited[r]=true;
		for (int i = 2; i < N+1; i++) {
			if(map[r][i]!=0 && !visited[i]) {
				if(cnt+map[r][i]>=min) continue;
				dfs(i,cnt+map[r][i],c+1);
				visited[i]=false;
			}
		}
	}

}

 

728x90

'알고리즘 > 정올' 카테고리의 다른 글

[JAVA] 정올 1037 오류교정  (0) 2021.08.29
복사했습니다!