hemilton cycle circuit
TRANSCRIPT
Hemilton Cycle Circuit
Steve Paks
Question
• 문제는 올림피아드 대회가 모두 해외에서 열리는 관계로 비행기 값이 굉장히 많이 들어간다는 것이다. 결국에는 집
으로 다시 돌아와야 하는데, 모든 대회에 1번씩만 참가하고 집으로 돌아오는 경비를 가장 최소화하고 싶다. 도경이
는 이것을 해결하지 못하면, 대회에 참가하기가 어렵게 된다. 대회는 참가하기만 하면 언제든지 알고리즘 문제를 풀
수 있기 때문에 경비를 계산하는 것 이외의 사항은 고려하지 않아도 된다.
• 입력 형식
첫 줄은 참가하는 대회의 수 N(1≤N≤12)을 입력 받는다. 이때, 출발지(집)는 1번으로 한다.
둘째 줄은 N X N 크기의 대회 개최지와 개최지를 이동하는 항공료(0 ≤ 항공료< 100)가 나온다. 각 항공료는 한 칸
의 공백으로 구분된다. 만약에 개최지에서 개최지로 이동할 수 있는 항공로가 없다면 항공료의 값을 0으로 표시한
다.
• 출력 형식
집에서 출발하여 전체 대회를 모두 참가하고 돌아올 때, 최소의 항공료를 출력한다.
• 입력 예
• 출력 예
5
0 14 4 10 20
14 0 7 8 7
4 5 0 7 16
11 7 9 0 2
18 7 17 4 0
30
Hint.
비용 (경로)
10 (1->4)
+ 2 (4->5)
+ 7 (5->2)
+ 7 (2->3)
+ 4 (3->1)
= 30
Algorithm
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4 0 1 2 3 4
0 1 2 3 4 0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4 0 1 2 3 4
0 1 2 3 4 0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
Algorithm(Cont’d)
getMinPath
0 → 1 : 14
+ 1 → 2 : 7
+ 2 → 3 : 7
+ 3 → 4 : 2
+ 4 → 0 : 18
= 48 = MinPath
5
0 14 4 10 20
14 0 7 8 7
4 5 0 7 16
11 7 9 0 2
18 7 17 4 0
getMinPath
0 → 1 : 14
+ 1 → 3 : 8
+ 3 → 2 : 7
+ 2 → 4 : 16
+ 4 → 0 : 18
= 63 = DropPath
getMinPath
0 → 1 : 14
+ 1 → 2 : 7
+ 2 → 4 : 7
+ 4 → 3 : 4
+ 3 → 0 : 11
= 43 = MinPath
getMinPath
0 → 1 : 14
+ 1 → 3 : 8
+ 3 → 4 : 2
+ 4 → 2 : 17
+ 2 → 0 : 14
= 55 = DropPath
…
Core methods
• makeAvailableCircuit()– 가능한 루트를 찾음
• containsSite(int)– 사이트를 반복해서 방문하는 지 검토
• findMinCircuit()– 모든 사이트를 순회 한 경우
– 지나 온 경로의 비용을 합하여 가능한 다른 경로에서 발생한 비용과 비교 후 작으면 최소경로로 지정