w와 h가 별로 크지 않아서, 저는 그냥 우선순위우선 탐색으로 (Queue대신 Priority Queue 사용) 시간을 가중치로 풀었는데, 동일하게 50%에서 오류가 납니다.
그래서 생각해 보니.. 문제 자체에 좀 함정이 있는듯 합니다. 설마 싶은데.. 혹시 제가 생각하는게 맞다면, 문제 자체에 명확히 해야 하는 부분이 있습니다.
확인해 본 후, 제가 생각한게 맞다면, 다시 댓글 달겠습니다.
3860번 - 할로윈 묘지
음의 사이클을 타지만 도착할 수 없을 경우에 대한 설명이 좀 애매한 것 같은데... 원문에서는 "For each test case, if it is possible for Scared John to travel back in time indefinitely, output Never. Otherwise, print the minimum time in seconds that it takes him to cross the graveyard from the entrance to the exit if it is reachable, and Impossible if not."라고 합니다. 즉 음의 사이클에 빠질 수 있는지가 그 사이클에서 도착점으로 갈 수 있는지보다 우선시되는 것 같습니다.
저도 @jh05013 님의 생각에 동의합니다.
굳이 음의 싸이클이 꼭 아니어도, 0의 싸이클이 존재해도 never가 되어야 하는걸로 보입니다. 제가 위에 올려놓은 예시가 그렇습니다.
원문을 자세히 보시면, "travel back in time indefinitely" 라는 말이 있는데, 계속해서 과거로 갔을때를 의미한다기 보다는 시간이 더이상 늘지 않고무제한으로 travel back 하는 경우가 있다면, Never가 떠야 할것 같습니다.
명확히 했으면 하는 부분은, 만약 무제한으로 돌아갈 수 있는 구간이 있으나, 그 구간으로 가는 길이 목적지보다 멀리 돌아가는 경우라고 한다면, Never인건지, 답을 출력해야 하는건지 확실치 않습니다.
해결했습니다.
바꾼부분은 별거없고 저기 edge넣어주는 부분에서 if문 처리한 부분들 다 빼줬습니다.
그리고 한가지 도착지점인 E에서는 나가는 간선이 없어야 합니다.
이부분에 대한 반례는 잘 생각해보시면 될듯...
@jh05013 감사합니다.^^; 이제 명확해진거 같습니다. 이거 문제 자체가 정말 깊게 생각하지 않으면 함정이 많네요..^^;
음의 사이클 부터 찾고 시작하면 정답이고, 일단 짧은 거리부터 탐색하게 되면, 오답이군요.. 일단은, 곰곰히 정말 자세히 따져보면, jh05013님이 풀이하시는 방법이 맞는것 같습니다.
위의 예에서(-12 일때), 3,4위치에 있을때, 그냥 나가버리는 것 보다, 돌아서 가는것이 더 빠른 경우가 생길 수 있게 되어버리고, 그러다 보면 음의 싸이클을 타게 되지만, 단순한 탐색으로는 3,4에 있으면 그냥 나가버리는게 그 순간 가장 짧은 길이 되어버리네요.
번역본에는 애매하게 주어져 있는데 원문에서는 명확합니다.
"he will leave as soon as he reaches it, determined never to set foot anywhere in the graveyard again."
라는 @jh05013 님의 설명 중에 반례가 있으니 참고 바랍니다.
각 테스트 케이스 마다 상근이가 과거로 계속해서 돌아간다면 "Never"를 출력하고, 출구를 빠져나올 수 없으면 "Impossible"을 출력한다. 그 외의 경우에는 묘지를 빠져나오는데 가장 빠른 시간을 출력한다.
문제의 출력 조건에 명시되어 있듯이 과거로 돌아가기 때문에 출구를 빠져나올 수 없을 때 Never가 아니고, 과거로 돌아가기만 한다면 Never를 출력하라는걸 보아 그냥 시작점에서 도달할 수 있는 음의 사이클 유무만 찾으면 되는듯 합니다.
출력 조건에도 Never를 젤 먼저 출력하라고 적혀있는걸 보면 음의 사이클 or 0의 사이클때문에 출구를 빠져나올 수 없다고 Impossible을 출력하라는 것이 아닌것 같아 보입니다.
댓글을 작성하려면 로그인해야 합니다.
juhongkim2 5년 전
음수간선이 존재하기 때문에 벨만-포드 알고리즘을 사용했습니다
그래프를 어떻게 만들어야 하나...하고 고민하다가 다음처럼 그래프를 만들었습니다.
문제의 예시로 보여드리자면(S시작 E도착 G묘지 H구멍 0빈칸)
W=4, H=3일때
S 0 0 H
0 0 G G
0 0 0 E
에서 그리드의 각 칸을 노드로 생각하고 왼쪽 위부터 오른쪽 아래까지 1부터 W*H까지 번호를 매겼습니다.
벨만 포드 알고리즘을 써서 최단거리(dist[W*H])를 구해줬습니다.
만약 음수사이클이 생긴다면 Never를
dist[W*H]==INF라면 Impossible을
나머지 경우에는 해당 최단거리를 출력하도록 했습니다
그런데 50퍼쯤에서 틀리는데 어떤반례가 있을까요...
아니면 제가 애초에 문제푸는 방향을 잘못 잡은걸까요?