# 1786. Number of Restricted Paths From First to Last Node
###### tags: `Leetcode` `Medium` `BFS` `Dynamic Programming` `Dijkstra`
Link: https://leetcode.com/problems/number-of-restricted-paths-from-first-to-last-node/
## 思路
先用dijkstra找到每个从node n到其他node的最短距离
然后用dp找到最短路径的个数
## Code
```java=
class Solution {
public int countRestrictedPaths(int n, int[][] edges) {
//dijkstra
List<List<int[]>> graph = new ArrayList<>();
for(int i=0; i<=n; i++){
graph.add(new ArrayList<>());
}
for(int[] edge:edges){
int s = edge[0], t = edge[1], w = edge[2];
graph.get(s).add(new int[]{t,w});
graph.get(t).add(new int[]{s,w});
}
Queue<int[]> pq = new PriorityQueue<>((a,b)->(a[1]-b[1]));
pq.add(new int[]{n,0});
int[] shortestDist = new int[n+1];
Arrays.fill(shortestDist, Integer.MAX_VALUE);
shortestDist[n]=0;
while(!pq.isEmpty()){
int[] curr = pq.poll();
for(int[] neighbor:graph.get(curr[0])){
if(curr[1]+neighbor[1]<shortestDist[neighbor[0]]){
shortestDist[neighbor[0]] = curr[1]+neighbor[1];
pq.add(new int[]{neighbor[0],shortestDist[neighbor[0]]});
}
}
}
//dfs dp
Integer[] dp = new Integer[n];
return dfs(1, n, shortestDist, graph, dp);
}
private int dfs(int start, int end, int[] shortestDist, List<List<int[]>> graph, Integer[] dp){
int mod = 1000000007;
long res = 0;
if(start==end) return 1;
if(dp[start]!=null) return dp[start];
for(int[] next:graph.get(start)){
if(shortestDist[start]>shortestDist[next[0]])
res += dfs(next[0], end, shortestDist, graph, dp);
res = res%mod;
}
dp[start] = (int)res;
return (int)(dp[start]%mod);
}
}
```