lvhi0607   2년 전

안녕하세요. 외판원 순회 문제를 풀다가 도저히 잘못된 부분을 찾기 어려워 고수분들의 도움을 받고자 질문글을 올립니다.

우선 문제를 보고 

1. 주어진 경로(가중치)를 이차원 배열에 저장한 후

2. Floyd-Warshall 알고리즘으로 각 정점에서 다른 모든 정점으로 가는 최소 가중치를 갱신한 후

3. 임의의 한 정점(코드 상에선 1번 정점)에서 출발해 DFS 형태로 모든 정점을 1번만 방문 후 다시 출발지로 돌아오는 경우의 최소 비용을 구하였습니다.

DFS의 시간복잡도 개선을 위해 메모이제이션 (배열 D)을 이용했습니다. 그런데 이 방식대로 작성한 코드를 제출하면 틀렸다고 나오네요..

예시 입력이 1개뿐이라, 반례를 찾기도 어렵습니다.. 어느 부분에 문제가 있을까요? ㅠ

lcr7324   2년 전

floyd-warshall을 돌린 부분이 문제가 아닐까요? 예컨대 정점 A에서 B로 바로 가는 경로의 비용이 10인데, C를 거쳐서 가면 5로 줄어들고 이게 A와 B 사이의 최단거리라 합시다.

그러면 이제 DFS에서 A -> B -> C 같은 경로를 답으로 계산하게 된다면 이는 사실 C를 중복으로 방문한 것이 됩니다.

floyd-warshall 부분을 아예 제외하고 실행하면 어떨까 싶습니다.

lvhi0607   2년 전

@lcr7324 답변 감사합니다. 생각해보니 말씀하신대로 특정 경유지를 거치는 최단 경로를 찾으면 안되는 거였네요... 다만 해당 코드를 제거한 후 돌려도 6%에서 틀렸습니다 가 나옵니다 ㅠㅠ 플로이드와샬 외에도 다른 잘못된 부분이 있는 것 같습니다.

댓글을 작성하려면 로그인해야 합니다.