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 문제풀이


댓글남기기