plan222   3년 전

갱신하기전에 현재 노드까지의 거리가 무한대라면 스킵하도록 하는 부분만 지우니까 정답이 됩니다.

32~33번 째 줄은 -1을  출력해야하는지 판단 하는 곳에서 썼고, 88~89번 째 줄은 벨만 포드를 할 때 썼습니다.

도대체 어떤 경우에 출력이 달라 질 수 있는지 궁금합니다.

p_ce1052   3년 전

INF값이 충분히 크지 않은 것 같습니다. 절대 나올 수 없는 값이 INF가 되어야 하는데 금품을 다 모으면 10억 이상의 값이 나올수 있을 것 같습니다.

plan222   3년 전

w가 최대 1000에 100회정도 탐색하면 10만 정도 아닌가요?

p_ce1052   3년 전

문제 지문만 보고 답글 드리는거라 정확한 답변을 드리지 못하는 점 죄송합니다 지금 문제를 풀어보기엔 너무 졸려서 ..

일단 올려주신 코드에서 무한대면 스킵하는 부분의 무한대 값을 INT32_MAX로 바꾸고 제출해보니 통과가 된다는 점과

지문에서 한 번 지나간 길을 다시 지나가도 금품을 갈취당하거나 획득한다 따라서 값은 계속 커질 수 있다. 

두 가지를 근거로 INF값이 충분하지 않기 때문에 틀리신 거라는 답변을 드렸습니다.

plan222   3년 전

INT32_MAX면 풀린다니 신기하네요. 그 점을 좀더 생각해봐야겠네요 감사합니다~

plan222   3년 전

제출하신 코드 읽어보니 초기화는 987654321 인데 INT32_MAX와 비교해서 항상 통과되는거 같네요

p_ce1052   3년 전

그렇군요 결국 왜 아직 거리가 inf인 정점을 무시하고 갱신하지 않으면 틀리는지...원점으로 돌아왔네요

p_ce1052   3년 전

확실한 이유를 알고 답글을 달았어야 하는데 죄송합니다 ㅠㅠ

plan222   3년 전

아니예요 답변 달아주시려고 한것 만으로도 감사하죠

plan222   3년 전

벨만 포드를 2*n번 까지 수행하니 맞았습니다.

무한을 건너뛰게 되면 도달하지 못하는 어떠한 경로가 존재하는 것 같아요.

원래 vertex-1 번만 수행하면 되는 것으로 알고있는데, 제가 구현한 벨만포드에 하자가 있는 모양입니다.

자고 일어나서 분석해봐야겠습니다.

p_ce1052   3년 전

저도 n-1번 수행하고 마지막에 relaxation을 한 번 더 수행하는 와중에 갱신이 일어나면 사이클이 존재한다 로 알고 있습니다.

틀리는 진짜 이유가 너무 궁금하네요 INF인 노드는 분명 연결된 간선을 절대로 볼 필요가 없는데 

plan222   3년 전

36, 92 번 째 줄이 문제였습니다.

if (dist[0][i] + element.second < dist[1][element.first]) 로 고치니 맞습니다.

INF무시하지 않도록 만든 코드는

4 4
1 4 2
2 3 1
3 2 1
3 4 1

같은 반례가 존재하지만 적절한 테스트 케이스가 없어서 우연히 통과 한 것으로 보입니다.

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