IT/Algorithm

특정한 최단 경로_다엑스트라_백준_1504

ahj990510 2025. 3. 3. 20:34

-문제-

 

-문제 접근-

이 문제는 N번의 정점으로 가는 최단 경로에서 주어진 두 지정 정점(v1, v2)를 거쳐야되는 조건이 들어 있는 문제로

두 지정 정점을 지나는 최단 거리를 구하는 문제입니다.

 

조건:

  • 그래프는 방향성이 없는 (양방향) 가중치 그래프입니다.
  • 한 번 방문한 정점이나 간선을 다시 방문할 수 있으며 전체 경로는 최단 경로여야 합니다.

문제의 조건에 따른 경로의 경우

 

  • 경우 1: 1 → v1 → v2 → N
  • 경우 2: 1 → v2 → v1 → N

두 경로 중 더 짧은 경로의 거리를 구하면 된다는 것을 알 수 있습니다.

 

접근 방식:

인접 리스트

  • 각 정점을 배열의 인덱스로 관리하고, 각 정점에 연결된 간선들을 구조체(Edge)를 사용하여 저장합니다.

다익스트라

  • 시작 정점에서 다른 모든 정점까지의 최단 거리를 구하며 우선순위 큐를 사용하여 현재까지 발견된 가장 짧은 경로를 가진 정점을 선택하고, 인접 정점의 거리를 갱신합니다.

 

위 문제에서는 다익스트라를 3번 실행을 합니다.(모든 정점)

  • 1번 정점에서 출발
  • v1에서 출발
  • v2에서 출발

경로 경우의 수

  • 경우 1: 1 → v1 → v2 → N
  • 경우 2: 1 → v2 → v1 → N

-코드-

 

 

-코드 설명-

 

numeric_limits<int>::max():

최단 거리 계산에 문제가 생기지 않도록 INF로 초기화

 

greater<pair<int,int>> 사용:
우선순위 큐가 최소 힙처럼 동작하도록 만들어, 작은 값이 우선 순위를 가지도록 합니다.

 

그래프 구성:

  • Graph graph(N+1);을 통해 1번부터 N번 정점을 사용할 수 있도록 인접 리스트를 구성합니다.
  • 각 간선에 대해 양방향으로 정보를 저장합니다.

최단거리 계산:

  • 다익스트라 1: 1번 정점에서 모든 정점까지의 최단 거리 → distFrom1
  • 다익스트라 2: v1에서 모든 정점까지의 최단 거리 → distFromV1
  • 다익스트라 3: v2에서 모든 정점까지의 최단 거리 → distFromV2

이후,

  • 경우 1: distFrom1[v1] + distFromV1[v2] + distFromV2[N]
  • 경우 2: distFrom1[v2] + distFromV2[v1] + distFromV1[N]

 

 

-END-

'IT > Algorithm' 카테고리의 다른 글

Z_백준1074_재귀  (0) 2025.03.10
피보나치 수_백준_2747  (0) 2025.03.09
키로커_스택_백준_5397  (0) 2025.03.03
스택 수열_백준_1874  (0) 2025.02.27
가장높은탑쌓기_DP_백준_2655  (0) 2025.02.24