11581번 - 구호물자
floyd warshall 돌리고 그냥 func을 통해서 대칭되는 부분, 즉 cycle이 있는지 확인 하는데 실패합니다.
이면 graph[0][1] graph[1][0]이 cycle을 만들기 때문에 cycle 이 존재
이면 no cycle
이 문제가 지문이 참 헷갈리는데,
중간에 cycle이 존재하더라도, 1번 노드에서 갈 수 없는 cycle인 경우는 cycle로 포함하지 않고 생각해줘야 AC를 받습니다.
도움이 될만한 test case를 첨부해드릴게요.
엄..
if 0<graph[0][b]<INF:
한 줄 추가해서 1에서 갈 수 있는지 검사를 추가 했는데 그래도 56%에서 실패 합니다 ㅜㅜ
뒤늦게 발견했네요
20번째 줄을 한번 잘 보시겠어요?
오.. 없애니까 통과는 하는데 저게 왜 문제가 되는지 잘 모르겠습니다.. graph[a][b] 와 graph[b][a]가 존재하는지 를 비교하는게 잘못 된 방식이고 graph[a][a]가 존재 하는 지를 보는 게 맞는거여서 그런걸까요?
사이클이 존재한다면 자기 자신으로 돌아오는 길이 존재할 것입니다.
따라서 graph[a][a]만 체크해주면 되긴 합니다만, 질문자님처럼 이중for문으로 체크해줘도 상관없습니다. Graph[a][b], graph[b][a] 둘 다 inf가 아니라는 것은 결국 graph[a][a]가 inf가 아니라는 것이기 때문이에요.
질문자님의 처음 코드가 틀렸던 이유는 graph[i][i]를 0으로 초기화시켜버렸기 때문에 플로이드 코드에서 의도치 않은 현상이 발생하기 때문입니다
넵 ㅜㅠ 책을 보고 하는데 책에서는 그냥 graph[i][i]를 0으로 초기화 시키고 시작하더라구요.. 항상 그러는게 옳진 않다는 것을 잘 배우고갑니다!!! 감사합니다!!!
대부분의 문제에선 i번째 노드에서 i번째 노드까진 원래 이동하지 않고도 도달가능하기 때문에 0으로 초기화하는게 맞아요.
다만 이 문제는 도달불가능할 경우 inf로 잡으셨기 때문에 사이클이 존재하지 않는 한 graph[i][i]는 inf로 두는 게 맞습니다.
늦은 밤까지 수고 많으셨어요 ㅎㅎ 화이팅입니다 :)
댓글을 작성하려면 로그인해야 합니다.
ili0820 2년 전
floyd warshall 돌리고 그냥 func을 통해서 대칭되는 부분, 즉 cycle이 있는지 확인 하는데 실패합니다.
이면 graph[0][1] graph[1][0]이 cycle을 만들기 때문에 cycle 이 존재
이면 no cycle