def prim(graph): """Algoritmo di Prim per la ricerca del minimo albero ricoprente. Variante che utilizza un albero binario per la gestione della frontiera tramite coda con priorita'. """ n = len(graph.nodes) currentWeight = n * [INFINITE] #imposta il peso degli archi a infinito pq = PriorityQueue() #rappresenta la frontiera dell'albero generato root = 0 #scelgo arbitrariamente il nodo 0 come radice currentWeight[root] = 0 mstNodes = set() #insieme dei nodi correnti inclusi nella soluzione #inizializzazione dell'albero treeNode = TreeArrayListNode(root) tree = TreeMod(treeNode) mstNodes.add(root) #inizializzazione pq pq.insert((root, Edge(root, root, 0)), 0) #triviale mstWeight = 0 while not pq.isEmpty(): vertex = pq.findMin() pq.deleteMin() if (vertex[0]) not in mstNodes: #nodo non ancora aggiunto al mst #aggiornare albero e peso mst connectingEdge = vertex[1] treeNode = TreeArrayListNode(vertex[0]) father = tree.foundNodeByElem(connectingEdge.tail) father.sons.append(treeNode) treeNode.father = father mstNodes.add(vertex[0]) mstWeight += connectingEdge.weight #print(currentWeight) currNode = graph.inc[vertex[0]].getFirstRecord() while currNode != None: #scorre tutti gli archi incidenti #semplici variabili per semplificare il codice edge = currNode.elem head = edge.head tail = edge.tail weight = edge.weight currWeight = currentWeight[head] if head not in mstNodes: #inserisco solo i nodi che portano #verso vertici non ancora scelti pq.insert((head, edge), weight) if currWeight == INFINITE: currentWeight[head] = weight elif weight < currWeight: currentWeight[head] = weight currNode = currNode.next return mstWeight, tree
def Dijkstra(graph, root): n = len(graph.nodes) currentWeight = n * [INFINITE] #imposta il peso degli archi a infinito pq = PriorityQueue() #rappresenta la frontiera dell'albero generato currentWeight[root] = 0 mstNodes = set() #insieme dei nodi correnti inclusi nella soluzione #inizializzazione dell'albero treeNode = TreeArrayListNode(root) tree = TreeMod(treeNode) mstNodes.add(root) #inizializzazione pq pq.insert((root, Edge(root, root, 0)), 0) #triviale mstWeight = 0 while not pq.isEmpty(): vertex = pq.findMin() pq.deleteMin() if (vertex[0]) not in mstNodes: #nodo non ancora aggiunto #aggiornare albero e peso mst connectingEdge = vertex[1] treeNode = TreeArrayListNode(vertex[0]) father = tree.foundNodeByElem(connectingEdge.tail) father.sons.append(treeNode) treeNode.father = father mstNodes.add(vertex[0]) mstWeight += connectingEdge.weight #print(currentWeight) currNode = graph.inc[vertex[0]].getFirstRecord() while currNode != None: #scorre tutti gli archi incidenti #semplici variabili per semplificare il codice edge = currNode.elem head = edge.head tail = edge.tail weight = edge.weight currWeight = currentWeight[head] distTail = currentWeight[tail] if head not in mstNodes: #inserisco solo i nodi che portano #verso vertici non ancora scelti pq.insert((head, edge), distTail + weight) if currWeight == INFINITE: currentWeight[head] = distTail + weight elif distTail + weight < currWeight: currentWeight[head] = distTail + weight currNode = currNode.next return currentWeight
def genericSearch(self, root): treeNode = TreeArrayListNode(root) tree = Tree(treeNode) vertexSet = set() #nodi da esaminare markedNodes = set() #nodi gia' marcati per essere esaminati markedNodes.add(root.index) vertexSet.add(treeNode) while len(vertexSet) > 0: #finche' ci sono nodi da esaminare treeNode = vertexSet.pop() #un generico nodo non esaminato nodes = self.foundNodesBySource(treeNode.info.index) for nodeIndex in nodes: if nodeIndex not in markedNodes: #crea il nodo per l'albero e #collega padre e figlio newTreeNode = TreeArrayListNode(self.nodes[nodeIndex]) markedNodes.add(nodeIndex) newTreeNode.father = treeNode treeNode.sons.append(newTreeNode) vertexSet.add(newTreeNode) else: currNode = tree.foundNodeByIndex(nodeIndex) #TODO: aggiorna il padre return tree