Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 4fe765d

Browse files
committed
feat: add solutions to lc problem: No.1786
No.1786.Number of Restricted Paths From First to Last Node
1 parent 7dd6ed7 commit 4fe765d

File tree

6 files changed

+639
-0
lines changed

6 files changed

+639
-0
lines changed

‎solution/1700-1799/1786.Number of Restricted Paths From First to Last Node/README.md‎

Lines changed: 217 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,22 +53,239 @@
5353

5454
<!-- 这里可写通用的实现逻辑 -->
5555

56+
**方法一:堆优化 Dijkstra + 记忆化搜索**
57+
5658
<!-- tabs:start -->
5759

5860
### **Python3**
5961

6062
<!-- 这里可写当前语言的特殊实现逻辑 -->
6163

6264
```python
65+
class Solution:
66+
def countRestrictedPaths(self, n: int, edges: List[List[int]]) -> int:
67+
@cache
68+
def dfs(i):
69+
if i == n:
70+
return 1
71+
ans = 0
72+
for j, _ in g[i]:
73+
if dist[i] > dist[j]:
74+
ans = (ans + dfs(j)) % mod
75+
return ans
6376

77+
g = defaultdict(list)
78+
for u, v, w in edges:
79+
g[u].append((v, w))
80+
g[v].append((u, w))
81+
q = [(0, n)]
82+
dist = [inf] * (n + 1)
83+
dist[n] = 0
84+
mod = 10**9 + 7
85+
while q:
86+
_, u = heappop(q)
87+
for v, w in g[u]:
88+
if dist[v] > dist[u] + w:
89+
dist[v] = dist[u] + w
90+
heappush(q, (dist[v], v))
91+
return dfs(1)
6492
```
6593

6694
### **Java**
6795

6896
<!-- 这里可写当前语言的特殊实现逻辑 -->
6997

7098
```java
99+
class Solution {
100+
private static final int INF = Integer.MAX_VALUE;
101+
private static final int MOD = (int) 1e9 + 7;
102+
private List<int[]>[] g;
103+
private int[] dist;
104+
private int[] f;
105+
private int n;
106+
107+
public int countRestrictedPaths(int n, int[][] edges) {
108+
this.n = n;
109+
g = new List[n + 1];
110+
for (int i = 0; i < g.length; ++i) {
111+
g[i] = new ArrayList<>();
112+
}
113+
for (int[] e : edges) {
114+
int u = e[0], v = e[1], w = e[2];
115+
g[u].add(new int[]{v, w});
116+
g[v].add(new int[]{u, w});
117+
}
118+
PriorityQueue<int[]> q = new PriorityQueue<>((a, b) -> a[0] - b[0]);
119+
q.offer(new int[]{0, n});
120+
dist = new int[n + 1];
121+
f = new int[n + 1];
122+
Arrays.fill(dist, INF);
123+
Arrays.fill(f, -1);
124+
dist[n] = 0;
125+
while (!q.isEmpty()) {
126+
int[] p = q.poll();
127+
int u = p[1];
128+
for (int[] ne : g[u]) {
129+
int v = ne[0], w = ne[1];
130+
if (dist[v] > dist[u] + w) {
131+
dist[v] = dist[u] + w;
132+
q.offer(new int[]{dist[v], v});
133+
}
134+
}
135+
}
136+
return dfs(1);
137+
}
138+
139+
private int dfs(int i) {
140+
if (f[i] != -1) {
141+
return f[i];
142+
}
143+
if (i == n) {
144+
return 1;
145+
}
146+
int ans = 0;
147+
for (int[] ne : g[i]) {
148+
int j = ne[0];
149+
if (dist[i] > dist[j]) {
150+
ans = (ans + dfs(j)) % MOD;
151+
}
152+
}
153+
f[i] = ans;
154+
return ans;
155+
}
156+
}
157+
```
158+
159+
### **C++**
160+
161+
```cpp
162+
using pii = pair<int, int>;
163+
164+
class Solution {
165+
public:
166+
const int inf = INT_MAX;
167+
const int mod = 1e9 + 7;
168+
vector<vector<pii>> g;
169+
vector<int> dist;
170+
vector<int> f;
171+
int n;
172+
173+
int countRestrictedPaths(int n, vector<vector<int>>& edges) {
174+
this->n = n;
175+
g.resize(n + 1);
176+
dist.assign(n + 1, inf);
177+
f.assign(n + 1, -1);
178+
dist[n] = 0;
179+
for (auto& e : edges)
180+
{
181+
int u = e[0], v = e[1], w = e[2];
182+
g[u].emplace_back(v, w);
183+
g[v].emplace_back(u, w);
184+
}
185+
priority_queue<pii, vector<pii>, greater<pii>> q;
186+
q.emplace(0, n);
187+
while (!q.empty())
188+
{
189+
auto [_, u] = q.top();
190+
q.pop();
191+
for (auto [v, w] : g[u])
192+
{
193+
if (dist[v] > dist[u] + w)
194+
{
195+
dist[v] = dist[u] + w;
196+
q.emplace(dist[v], v);
197+
}
198+
}
199+
}
200+
return dfs(1);
201+
}
202+
203+
int dfs(int i) {
204+
if (f[i] != -1) return f[i];
205+
if (i == n) return 1;
206+
int ans = 0;
207+
for (auto [j, _] : g[i])
208+
{
209+
if (dist[i] > dist[j])
210+
{
211+
ans = (ans + dfs(j)) % mod;
212+
}
213+
}
214+
f[i] = ans;
215+
return ans;
216+
}
217+
};
218+
```
219+
220+
### **Go**
221+
222+
```go
223+
const inf = math.MaxInt32
224+
const mod = 1e9 + 7
225+
226+
type pair struct {
227+
first int
228+
second int
229+
}
230+
231+
var _ heap.Interface = (*pairs)(nil)
232+
233+
type pairs []pair
234+
235+
func (a pairs) Len() int { return len(a) }
236+
func (a pairs) Less(i int, j int) bool {
237+
return a[i].first < a[j].first || a[i].first == a[j].first && a[i].second < a[j].second
238+
}
239+
func (a pairs) Swap(i int, j int) { a[i], a[j] = a[j], a[i] }
240+
func (a *pairs) Push(x interface{}) { *a = append(*a, x.(pair)) }
241+
func (a *pairs) Pop() interface{} { l := len(*a); t := (*a)[l-1]; *a = (*a)[:l-1]; return t }
71242

243+
func countRestrictedPaths(n int, edges [][]int) int {
244+
g := make([]pairs, n+1)
245+
for _, e := range edges {
246+
u, v, w := e[0], e[1], e[2]
247+
g[u] = append(g[u], pair{v, w})
248+
g[v] = append(g[v], pair{u, w})
249+
}
250+
dist := make([]int, n+1)
251+
f := make([]int, n+1)
252+
for i := range dist {
253+
dist[i] = inf
254+
f[i] = -1
255+
}
256+
dist[n] = 0
257+
h := make(pairs, 0)
258+
heap.Push(&h, pair{0, n})
259+
for len(h) > 0 {
260+
u := heap.Pop(&h).(pair).second
261+
for _, ne := range g[u] {
262+
v, w := ne.first, ne.second
263+
if dist[v] > dist[u]+w {
264+
dist[v] = dist[u] + w
265+
heap.Push(&h, pair{dist[v], v})
266+
}
267+
}
268+
}
269+
var dfs func(int) int
270+
dfs = func(i int) int {
271+
if f[i] != -1 {
272+
return f[i]
273+
}
274+
if i == n {
275+
return 1
276+
}
277+
ans := 0
278+
for _, ne := range g[i] {
279+
j := ne.first
280+
if dist[i] > dist[j] {
281+
ans = (ans + dfs(j)) % mod
282+
}
283+
}
284+
f[i] = ans
285+
return ans
286+
}
287+
return dfs(1)
288+
}
72289
```
73290

74291
### **...**

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /