le_effort   1년 전

문제를 다 풀고 다른 사람들은 어떻게 풀었나 궁금해서 구글링해서 보다가 이해가 안되는 부분이 있어서 질문드립니다.

세준이는 한번 이동했던 정점은 물론, 한번 이동했던 간선도 다시 이동할 수 있다. 

하지만 반드시 최단 경로로 이동해야 한다는 사실에 주의하라. 1번 정점에서 N번 정점으로 이동할 때, 주어진 두 정점을 반드시 거치면서 최단 경로로 이동하는 프로그램을 작성하시오.


이 조건이 주어져서 저는 아래와 같이 생각했습니다.

반드시 지나야하는 정점 2개를 first, second로 뒀을때

first-> 목적지,  second-> 목적지  로 간선이 연결되어있지 않아 못가는 경우를 생각해서 돌아오는 로직도 처리 해줬는데요

그림으로 설명하면 다음과 같습니다

preview

이와 같은 경우 출발 -> first -> second -> first -> 출발 -> 목적지로 가야 갈 수 있다고 생각했습니다

마찬가지로 first와 second가 연결되지 않았을 경우엔   출발 ->first  -> 출발 -> second 이런 경우의 수를 고려했는데 

많은 블로그 풀이를 보면

  1. 최단거리(1 ~ V1) + 최단거리(V1 ~ V2) + 최단거리(V2 ~ N)
  2. 최단거리(1 ~ V2) + 최단거리(V2 ~ V1) + 최단거리(V1 ~ N)

이런 경우만 고려했는데 어떻게 정답 처리가 되는건가요?

 "한번 이동했던 간선도 다시 이동할 수 있다" 이 조건을 고려하지 않고 문제를 푼 것 아닌가요?

아래는 제 코드입니다

문제 이해능력이 조금 부족한거 같은데 설명해주시면 감사하겠습니다 !!

Green55   1년 전

  1. 최단거리(1 ~ V1) + 최단거리(V1 ~ V2) + 최단거리(V2 ~ N)
  2. 최단거리(1 ~ V2) + 최단거리(V2 ~ V1) + 최단거리(V1 ~ N)

에서 각 최단거리(X~Y)를 구해 줄 때 다른 최단거리에서 밟았던 간선을 중복해서 밟을 수 있도록 구현 해주면 됩니다.


kokosoko59   1년 전



preview

first-> 목적지, second-> 목적지 로 간선이 연결되어있지 않아 못가는 경우, 출발 -> first -> second -> first -> 출발 -> 목적지 라는 경로를 따라가야 한다고 말씀해주셨습니다.

네 맞습니다. 하지만 [second -> first -> 출발 -> 목적지] 가 결국 second 에서 목적지로 가는 최단경로 이기 때문에 

  1. 최단거리(1 ~ V1) + 최단거리(V1 ~ V2) + 최단거리(V2 ~ N)

이 경우에 포함됩니다.

또 다른 예시로 들어주신 first와 second가 연결되지 않았을 경우, 출발 ->first -> 출발 -> second -> 목적지 라는 경로가 최적이라면 [first-> 출발 -> second]가 first에서 second로 가는 최단경로 이기 때문에 이 역시

  1. 최단거리(1 ~ V1) + 최단거리(V1 ~ V2) + 최단거리(V2 ~ N)

에 포함이 됩니다.

le_effort   1년 전

아아 이해 됐습니다 감사합니다 ㅎㅎㅎ!!

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