def newDijkstra(graph, s): """ Crea una busqueda Dijkstra para un digrafo y un vertice origen """ prime = nextPrime (g.numVertex(graph) * 2) search = {'graph':graph, 's':s, 'visitedMap':None, 'minpq':None} search['visitedMap'] = map.newMap(numelements=prime, maptype='PROBING', comparefunction=graph['comparefunction']) vertices = g.vertices (graph) itvertices = it.newIterator (vertices) while (it.hasNext (itvertices)): vert = it.next (itvertices) map.put (search['visitedMap'], vert, {'marked':False,'edgeTo':None,'distTo':math.inf}) map.put(search['visitedMap'], s, {'marked':True,'edgeTo':None,'distTo':0}) pq = minpq.newIndexMinPQ(g.numVertex(graph), comparenames) search['minpq'] = pq minpq.insert(search['minpq'], s, 0) while not minpq.isEmpty(search['minpq']): v = minpq.delMin(pq) if not g.containsVertex(graph,v): raise Exception("Vertex ["+v+"] is not in the graph") else: adjs = g.adjacentEdges(search['graph'],v) adjs_iter = it.newIterator (adjs) while (it.hasNext(adjs_iter)): w = it.next (adjs_iter) relax(search, w) # obtener los enlaces adjacentes de v # Iterar sobre la lista de enlaces # Relajar (relax) cada enlace return search
def relax(search, edge): v = e.either(edge) w = e.other(edge, v) visited_v = map.get(search['visitedMap'], v)['value'] visited_w = map.get(search['visitedMap'], w)['value'] if visited_w['distTo'] > (visited_v['distTo'] + e.weight(edge)): distToW = visited_v['distTo'] + e.weight(edge) map.put(search['visitedMap'], w, {'marked':True,'edgeTo':edge,'distTo':distToW}) if minpq.contains(search['minpq'], w): minpq.decreasePriority(search['minpq'], w, distToW) else: minpq.insert(search['minpq'], w, distToW)