rjsgh1232   4년 전

이 문제를 보면 아시다시피 의심이 가는 지점에 도달하는 거리가 반드시 g, h를 거쳐가야 한다고 알고 있습니다.

따라서 다익스트라를 한번 도는데 만약 g->h 의 경로나 h->g의 경로를 거쳐간다면 인자값에 불변수를 하나 준 뒤 g, h, 를 거쳐서 온 경로인지 아닌지 저장할 배열을 만들어

저장해줍니다. 다익스트라가 끝나고 배열요소를 검사하며 g->h또는 h->g경로를 지난 최소값이라면 ans로 출력해주는 것이지요.

하지만 이렇게 할 경우 50%에서 틀렸습니다가 나오는데 저의 로직에서 어디부분에 허점이 있을까요?

Green55   4년 전

g-h를 걸치는 경로와 g-h를 걸치지 않는 경로가 있을 때 둘의 가중치가 같다면 문제가 생길 수도 있습니다.

다익스트라가 찾아주는 경로가 반드시 전자라는 보장이 있나요?

rjsgh1232   4년 전

몇번 곱씹어 생각하니 그러네요 좋은 조언 감사합니다!!

whitealex95   2년 전

가중치가 같을 때에 지금까지 g-h 지남 여부에 대해 or 연산을 하면 해결 됩니다. 이게 더 빠름.

ljhhasang   2년 전

 다익스트라가 찾아주는 경로가 g-h를 거치게끔 보장할 수 있습니다.

priority queue를 maxheap으로 설정하고 경로업데이트를 할때마다 업데이트된 거리가 기존거리와 같은 것까지 포함하여 <-업데이트된 거리, 노드번호, g-h 지남여부> 튜플을 push 합니다. 

거리, 노드번호가 같을 때 g-h 지남여부가 true인것부터 pq 에서 pop되게 하면 항상 g-h를 거치는 최단거리를 선택하게 됩니다.

g-h 거치지 않는 최단거리선택후 g-h 거치는 가중치 같은 최단거리가 이후 pq에 추가될 수 있지 않냐 라고 의문을 가질수 있는데 간선의 길이가 0보다 클경우 다익스트라에서 불가능하다는 것을 알 수 있습니다. 

즉 다익스트라 한번으로 문제 풀이가능합니다.

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