최대 1 분 소요

Problem

https://www.acmicpc.net/problem/2176

Idea

합리적인 이동경로는 정점을 지날 때마다 T까지의 최단 경로 값이 줄어드는 경로를 말한다.

T를 시작점으로 다익스트라 알고리즘을 이용하여 T부터 각 노드까지의 최단 경로인 dist를 구한다. 이를 통해 T부터 S까지의 합리적인 이동경로를 구한다. T->S의 합리적인 이동경로는 결국 S->T의 합리적인 이동경로와 같기 때문이다.

다익스트라 알고리즘의 최단 경로 갱신 과정에서 현재 노드까지의 최단 경로보다 다음 노드까지의 최단 경로가 더 짧다면 그 노드를 거치는 경로가 있음을 의미한다. 다음 노드까지 도달하는 합리적인 이동경로의 수에 현재 노드까지 도달하는 합리적인 이동경로의 수를 더한다. 이 과정을 반복함으로써, T부터 S까지의 합리적인 이동경로의 수를 구할 수 있다.

Code

import sys
import heapq

input = sys.stdin.readline
   
def dijkstra(start):
    dist[start] = 0
    heap = []
    heapq.heappush(heap, (dist[start], start))

    while heap:
        cd, cn = heapq.heappop(heap)

        if cd > dist[cn]:
            continue

        for weight, nn in edge[cn]:
            if dist[cn] + weight < dist[nn]:
                dist[nn] = dist[cn] + weight
                heapq.heappush(heap, (dist[nn], nn))
                
            if dist[cn] > dist[nn]:
                dp[cn] += dp[nn]

N, M = map(int, input().split())
edge = [[] for _ in range(N+1)]
dist = [sys.maxsize for _ in range(N+1)]
dp = [0 for _ in range(N+1)]
for _ in range(M):
    A, B, C = map(int, input().split())
    edge[A].append((C, B))
    edge[B].append((C, A))

dp[2] = 1
dijkstra(2)
print(dp[1])

Comment

태그: , ,

카테고리:

업데이트: