def dijkstrasssp(s, inizio, g: Graph): d, p = initsssp(s, inizio, g) # inizializzazione di: d, p # coda di priorità Q (heap binaria) # i valori sono coppie (peso, nodo) il cui ordine si basa sul primo valore Q = MyHeap(d, g.dict_of_nodes()) # iterazione per ciascun elemento di Q while len(Q) > 0: u = Q.extract_min() # estraggo nodo con tempo di arrivo minimo if d[u] == float("inf"): break # considero ciascun nodo adiacente al nodo di partenza u for v in g.graph[u].keys(): # cerco l'arco che mi permette di arrivare prima possibile al successivo nodo v min_element = float("inf") for edge in g.graph[u][v]: # MA l'orario di partenza di una corsa presa non deve essere antecedente all'orario # di arrivo alla stazione di partenza u # Se alla stazione u arrivo un giorno successivo, ne tengo conto in time_arrival time_arrival = edge.time_arrival + (d[u] // 2400) * 2400 # Se una corsa parte ad un'orario precedente, la si può prendere il giorno dopo if d[u] % 2400 > edge.time_departure: time_arrival = time_arrival + 2400 # time_arrival è l'orario in cui arrivo a v considerando anche il giorno if time_arrival < min_element: min_element = time_arrival best_edge = edge # se (min_element == float("inf")) => non c'è un arco ammissibile tra i due nodi if min_element < float("inf") and min_element < d[v]: # trovato un arco teso: min_element rappresenta il nuovo orario di arrivo alla stazione v relax(u, v, best_edge, d, p, min_element) Q.decrease_key(v, d[v]) # d[v] è stato aggiornato return d, p
def create_new_heap(self, max_size=float("inf")): self.heaps.append(MyHeap(max_size))
def test_empty_after_construction(self): a = MyHeap() self.assertTrue(a.empty())
def test_keeps_heap_property(self): a = MyHeap() a.add(4) a.add(2) a.add(7) a.add(3) a.add(5) self.assertEqual(a.remove(), 2) self.assertEqual(a.remove(), 3) self.assertEqual(a.remove(), 4) self.assertEqual(a.remove(), 5) self.assertEqual(a.remove(), 7)
def test_random_remove_works(self): a = MyHeap() a.add(4) a.add(6) a.add(2) a.add(7) a.add(3) self.assertEqual(a.remove(),2) a.add(5) self.assertEqual(a.remove(), 3) self.assertEqual(a.remove(), 4) self.assertEqual(a.remove(), 5) self.assertEqual(a.remove(), 6) self.assertEqual(a.remove(), 7)
def test_after_adding_two_unordered_returns_same_ordered(self): a = MyHeap() a.add(4) a.add(3) self.assertEqual(a.remove(), 3) self.assertEqual(a.remove(), 4)
def test_after_adding_one_returns_same(self): a = MyHeap() a.add(5) self.assertEqual(a.remove(), 5)
def test_is_empty_afer_removing_elements(self): a = MyHeap() a.add(10) a.remove() self.assertTrue(a.empty())
def test_size_one_after_adding_one_element(self): a = MyHeap() a.add(5) self.assertEqual(a.size(),1)
def test_not_empty_after_adding_one_element(self): a = MyHeap() a.add(5) self.assertFalse(a.empty())