예제 #1
0
    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
예제 #2
0
    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
예제 #3
0
 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