1 분 소요

1. 문제

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

  • DP 문제
// 문제
그래프의 한 정점 S에서 다른 한 정점 T로 이동하려 한다. 
이동할 때 T에 가까워지며 이동하는 경우, 이를 합리적인 이동경로라 한다. 
물론 이러한 경로는 최단경로가 아닐 수도 있다.

그래프가 주어졌을 때 
가능한 합리적인 이동경로의 개수를 구하는 프로그램을 작성하시오. 
S = 1, T = 2 인 경우로 한다.

// 입력
첫째 줄에 정점의 개수 N(1 < N ≤ 1,000), 
간선의 개수 M(1 ≤ M ≤ 100,000이 주어진다. 
다음 M개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 
이는 A번 정점과 B번 정점이 길이 C(0 < C ≤ 10,000)인 
간선으로 연결되어 있다는 의미이다. 
두 정점은 최대 한 개의 간선으로만 연결될 수 있다. 간선은 방향성이 없다.

// 출력
첫째 줄에 답을 출력한다. 
답은 2147483647을 넘지 않는다.

// 예제 입력 1 
4 4
1 3 1
3 2 2
1 4 2
2 4 1

// 예제 출력 1 
2


2. 핵심 아이디어


3. Python 문제풀이

import sys, heapq
input = sys.stdin.readline
INF = 2147483647

n, m = map(int, input().split())
s, t = 1, 2
graph = [[] for _ in range(n+1)]
dist = [INF for _ in range(n+1)]
dp = [0 for _ in range(n+1)]

for _ in range(m) :
  a, b, c = map(int, input().split())
  graph[a].append([b, c])
  graph[b].append([a, c])

heap = [[0, t]]
dist[t] = 0
dp[t] = 1

while heap :
  cur_dist, now = heapq.heappop(heap)
  if cur_dist > dist[now] :
    continue
  for next, next_dist in graph[now] :
    total = next_dist + cur_dist
    if total < dist[next] :
      dist[next] = total
      heapq.heappush(heap, [total, next])
    if cur_dist > dist[next] :
      dp[now] += dp[next]

print(dp[s])


4. Java 문제풀이


댓글남기기