BOJ 1507. 궁금한 민호
1. 문제설명
- 플로이드-워셜 값이 주어진다.
- 어떤 정점에서 시작해서 모든 정점을 방문해야 한다.
-
최소 비용을 구하라
- 문제 분류
- Graph, Floyd
2. 알고리즘 설계
- 플로이드 값을 역탐색하는 문제이다.
- 문제를 풀이할 때 정말 난해했던 부분은, 말이 안되는 경우가 포함되어 있었다는 것이다.
D[i][j] > D[i][k]+D[k][j]
i->j
로 가는 경로와i->k->j
경로라는 의미인데,- 생각해보면, 플로이드를 갱신할 때 위의 조건이면 이미 값이 갱신되었어야 했다.
- 최단 경로이므로.. 그래서 이러한 경우는 말이 안되는 경우이다.
- 문제에서 대놓고 -1을 출력하라고 명시가 되어있었다.
- 말이 안되는 경우를 배제했으니, 최단 경로를 구해야 한다.
D[i][j] > D[i][k]+D[k][j]
이건 말이 안되지만,D[i][j] == D[i][k]+D[k][j]
이건 말이 된다.- 다만,
D[i][j]
는 두 개의 정점을 방문한 비용이고 우항은 3개의 정점을 방문한 비용이다. - 즉, 우항이 더 이득이라는 뜻이므로
D[i][j]
의 경로를 OFF한다.- 표현이 좀 이상한데, 비용을 더할 때 더하지 않는다는 뜻이다.
- 다만,
- OFF된 경로를 제외한 모든 비용을 더해준다.
- 테스트 케이스를 보면 대각선을 기준으로 대칭인 그래프이다.
- 즉, 우리는 같은 비용을 두번씩 더했다.
- 결과값/2가 우리가 찾던 정답값이 된다.