1
1
from collections import deque
2
+ from collections .abc import Iterator
2
3
from dataclasses import dataclass
3
- from typing import Iterator , List
4
+ from typing import Optional , Union
4
5
5
6
"""
6
7
Finding the shortest path in 0-1-graph in O(E + V) which is faster than dijkstra.
@@ -21,7 +22,7 @@ class AdjacencyList:
21
22
"""Graph adjacency list."""
22
23
23
24
def __init__ (self , size : int ):
24
- self ._graph : List [ List [Edge ]] = [[] for _ in range (size )]
25
+ self ._graph : list [ list [Edge ]] = [[] for _ in range (size )]
25
26
self ._size = size
26
27
27
28
def __getitem__ (self , vertex : int ) -> Iterator [Edge ]:
@@ -58,7 +59,7 @@ def add_edge(self, from_vertex: int, to_vertex: int, weight: int):
58
59
59
60
self ._graph [from_vertex ].append (Edge (to_vertex , weight ))
60
61
61
- def get_shortest_path (self , start_vertex : int , finish_vertex : int ) -> int :
62
+ def get_shortest_path (self , start_vertex : int , finish_vertex : int ) -> Optional [ int ] :
62
63
"""
63
64
Return the shortest distance from start_vertex to finish_vertex in 0-1-graph.
64
65
1 1 1
@@ -106,18 +107,21 @@ def get_shortest_path(self, start_vertex: int, finish_vertex: int) -> int:
106
107
ValueError: No path from start_vertex to finish_vertex.
107
108
"""
108
109
queue = deque ([start_vertex ])
109
- distances = [None for i in range ( self .size )]
110
+ distances : list [ Union [ int , None ]] = [None ] * self .size
110
111
distances [start_vertex ] = 0
111
112
112
113
while queue :
113
114
current_vertex = queue .popleft ()
114
115
current_distance = distances [current_vertex ]
116
+ if current_distance is None :
117
+ continue
115
118
116
119
for edge in self [current_vertex ]:
117
120
new_distance = current_distance + edge .weight
121
+ dest_vertex_distance = distances [edge .destination_vertex ]
118
122
if (
119
- distances [ edge . destination_vertex ] is not None
120
- and new_distance >= distances [ edge . destination_vertex ]
123
+ isinstance ( dest_vertex_distance , int )
124
+ and new_distance >= dest_vertex_distance
121
125
):
122
126
continue
123
127
distances [edge .destination_vertex ] = new_distance
0 commit comments