# 1976. Number of Ways to Arrive at Destination ###### tags: `Leetcode` `Dijkstra` `Priority Queue` `BFS` Link: https://leetcode.com/problems/number-of-ways-to-arrive-at-destination/ ## 思路 dijkstra 同时记录有多少条最短路径 ## Code ```python= class Solution: def countPaths(self, n: int, roads: List[List[int]]) -> int: graph = [[] for _ in range(n)] time = [inf]*n ways = [0]*n for u, v, t in roads: graph[u].append([v, t]) graph[v].append([u, t]) pq = [] time[0] = 0 ways[0] = 1 heappush(pq, [0, 0]) # time nodeIdx while pq: currTime, idx = heappop(pq) if idx == n-1: return ways[idx]%(10**9+7) for nextIdx, nextTime in graph[idx]: if currTime+nextTime<time[nextIdx]: time[nextIdx] = currTime+nextTime ways[nextIdx] = ways[idx] heappush(pq, [time[nextIdx], nextIdx]) elif currTime+nextTime == time[nextIdx]: ways[nextIdx] += ways[idx] return 0 ``` ```java= class Solution { public int countPaths(int n, int[][] roads) { List<List<int[]>> graph = new ArrayList<>(); for(int i=0; i<n; i++){ graph.add(new ArrayList<>()); } for(int[] road:roads){ int u = road[0], v = road[1], t = road[2]; graph.get(u).add(new int[]{v,t}); graph.get(v).add(new int[]{u,t}); } return dijkstra(graph, n); } private int dijkstra(List<List<int[]>> graph, int n){ Queue<int[]> pq = new PriorityQueue<>((a,b)->(a[1]-b[1])); int[] times = new int[n]; long[] ways = new long[n]; int mod = 1000000007; Arrays.fill(times, Integer.MAX_VALUE); times[0] = 0; ways[0] = 1; pq.add(new int[]{0,0}); while(!pq.isEmpty()){ int[] curr = pq.poll(); if(curr[0]==n-1) return (int)ways[curr[0]]; for(int[] next:graph.get(curr[0])){ int newTime = curr[1]+next[1]; if(newTime < times[next[0]]){ times[next[0]] = newTime; ways[next[0]] = ways[curr[0]]; pq.add(new int[]{next[0], newTime}); } else if(newTime == times[next[0]]){ ways[next[0]] = (ways[next[0]]+ways[curr[0]])%mod; } } } return 0; } } ```