1238] Silver Cow Party (파티) BOJ 2015. 12. 30. 23:59

문제 설명

: N개의 마을에 각각 한명의 학생이 있고 X(1<=X<=N) 마을에 모여서 파티를 한다.

파티를 하고 다시 집으로 돌아가는데, 이때 거리가 가장 긴 학생은 얼마나 걸었는지 출력하는 문제이다.



이 문제는 다익스트라를 이용하는데, 가장 쉽게 보이는 방법은 다익스트라를 n번 시행하는 것이다.

즉, 1->X, 2->X, 3->X....... N->X 까지 다익스트라를 N-1번 시행하고

한번 더 시행해서 X->1, X->2, X->3 ....... X->N 거리를 구하는 것이다. 


다익스트라의 시간 복잡도는 VlogE인데 V번 시행함으로써 V^2log(E)으로 상당한 시간이 걸리게 된다. 

물론 이 문제의 경우 다익스트라를 V번 시행해도 시간 내에 풀리지만


만약 V가 크다면? 정해진 시간 내에 구하는 것은 어려울 것이다. 


조금만 생각해보면 다익스트라를 V번 시행하지 않고 2번만 시행해도 

왕복거리를 구할 수 있다는 사실을 발견할 수 있다.

예를 들어보자면 1->2->3 인 경로가 있다. 이때에는 1->3에 대한 최단거리를 구했다고 볼 수 있다.


이 edge들을 역순으로 취한다면? 

즉, 1<-2<-3 과 같이 되는데 이때에는 3->1인 거리는 사실 1->3인 거리와 동일하기 때문에 

두번만으로도 구할 수 있는 것이다. 


이 문제에 대입해보자면, X마을에서부터 1,2,....N마을에 대해서 최단 경로를 구해준 다음,

테스트 케이스의 edge들을 역순으로 취하고 X마을에서부터 1,2,...N마을에 대해서 최단 경로를 구하면

이때에는 1,2.....,N마을에서부터 X마을까지의 최단거리가 구해지는 것이다.





문제링크 [1238 : Silver Cow Party]



소스 코드



'BOJ' 카테고리의 다른 글

1052] 물병  (0) 2016.07.22
1328] 고층 빌딩 , 8895] 막대 배치  (0) 2016.05.07
1007] Vector Matching  (0) 2016.01.01
1707] 이분 그래프  (0) 2016.01.01
2188] 축사 배정  (0) 2015.11.20