외판원 문제(TSP, 실버1)

2022. 8. 30. 14:58·알고리즘 (with JAVA)/완전 탐색

1. 문제 설명

(1) 한 도시를 출발하여 모든 도시를 전부 한 번씩 방문한 뒤 시작 도시로 돌아올려고 한다.

 

(2) 이때 가능한 모든 경로 중 가장 짧은 경로의 길이는 얼마일까?

 

 

 

 

2. 입출력 조건 및 예제

입력 조건

(1) 첫 번째 줄에는 문제의 개수 C를 입력받는다.

 

(2) 두 번째 줄부터는 도시의 개수 N을 입력받는다.

( 2 <= N  && N <= 10 )

 

(3) 세 번째 줄부터는 N개 도시들 만큼 각 도시간의 거리를 입력한다.

 

출력 조건

(1) 모든 도시를 방문하면서 가장 짧은 경로의 길이를 출력한다. 

 

입력 예제

3
4
0 3 4 8
3 0 6 7
4 6 0 5
8 7 5 0
3
0 3 4
3 0 6
4 6 0
5
0 3 4 8 1
3 0 6 7 5
3 6 0 5 6
8 7 5 0 4
1 5 6 4 0
 

 

출력 예제
19
13
19
 

 

 

3. 기저 사례

(1) 모든 도시들을 다 방문했을 때는 다시 시작 도시로 돌아가고 종료한다.

 

 

 

4. 코드

public class TSP {    
    // 도시의 수
    static int N;
    
    // 각 도시간의 거리
    static int[][] dis;
    
    // 각 도시 방문 여부
    static boolean[] visited;
    
    static BufferedReader sc = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer st;
    static StringBuilder sb = new StringBuilder();
    
    public static void main(String[] args) throws IOException {
        int C = Integer.parseInt(sc.readLine());
        for(int i=0; i<C; i++) {
            N = Integer.parseInt(sc.readLine());
            dis = new int[N][N];
            visited = new boolean[N];
            
            // 각 도시간의 거리 입력
            for(int y=0; y<N; y++) {
                st = new StringTokenizer(sc.readLine());
                for(int x=0; x<N; x++) {
                    dis[y][x] = Integer.parseInt(st.nextToken());
                }
            }
            sb.append(shortestPath(new ArrayList<>(), 0)+"\n");
        }
        System.out.println(sb);
    }
    
    // 가장 최단 거리를 찾는 함수
    static int shortestPath(ArrayList<Integer> curCity, int curLength) {
        // 모든 도시를 방문한 경우
        if(curCity.size()==N) {
            return curLength+dis[curCity.get(0)][curCity.get(curCity.size()-1)];
        }
        
        // 초기 ret값을 비교할 수 없을 정도로
        // MAX_VALUE 값 설정
        int ret=Integer.MAX_VALUE;
        
        // 현재 도시 위치
        int here = curCity.isEmpty()?0:curCity.get(curCity.size()-1);
        
        // 재귀 호출 시작
        for(int next=0; next<N; next++) {
            if(!visited[next]){
                visited[next]=true;
                curCity.add(next);
                ret = Math.min(ret, shortestPath(curCity, curLength+dis[here][next]));
                visited[next]=false;
                curCity.remove(curCity.size()-1);
            }
        }
        return ret;
    }
}
Colored by Color Scripter
cs

 

저작자표시 (새창열림)

'알고리즘 (with JAVA) > 완전 탐색' 카테고리의 다른 글

시계 맞추기 (골드1)  (0) 2022.08.31
게임판 덮기 (골드2)  (0) 2022.08.30
소풍 문제  (0) 2022.08.29
보글 게임 (골드2)  (0) 2022.08.29
n개의 원소 중 m개를 고르는 순열과 조합  (0) 2022.08.29
'알고리즘 (with JAVA)/완전 탐색' 카테고리의 다른 글
  • 시계 맞추기 (골드1)
  • 게임판 덮기 (골드2)
  • 소풍 문제
  • 보글 게임 (골드2)
백_곰
백_곰
  • 백_곰
    친절한 코딩
    백_곰
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 알고리즘 (with JAVA)
        • 기본 알고리즘
        • 완전 탐색
        • 분할 정복 알고리즘
        • 동적 계획법
        • 탐욕법
        • 코딩 테스트 기출 문제
        • 코드트리 조별과제
      • 백준 (with JAVA)
        • 완전 탐색
        • 분할 정복
        • 그 외
      • 자바
        • 개발 환경 구축하기
        • 팁
        • 기본적인 개념
        • 컬렉션 프레임워크
        • 프로세스와 쓰레드
        • 지네릭스
        • 람다식
        • 스트림
        • 입출력 IO
        • 네트워킹
        • 열거형(enums)
        • java.lang 패키지
        • java.time 패키지
        • 유용한 클래스들
        • 형식화 클래스들
      • 안드로이드 with 자바
        • 응용 문제들
        • 자잘한 문제들
        • 오류 보고서
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      java.time 패키지
      소켓 프로그래밍
      불안정 정렬
      file
      Collections Framework
      serializable
      다형성
      안드로이드 스튜디오
      InputStream
      코딩테스트
      역직렬화
      유용한 클래스
      Arrays
      outputstream
      TCP 소켓 프로그래밍
      제자리 정렬
      스트림
      map()
      자바 개념
      문자 기반 스트림
      알고스팟
      중간연산
      java.lang패키지
      코드트리
      ServerSocket
      코딩트리조별과제
      선택 정렬
      람다식
      snail
      안정 정렬
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    백_곰
    외판원 문제(TSP, 실버1)
    상단으로

    티스토리툴바