Beispiel #1
0
class FindBridges:
    def __init__(self, V):
        self.graph = GraphAdj(V)
        self.disjointSet = DisjointSet(V)
        self.V = V

    def addEdge(self, u, v):
        self.graph.addEdge(u, v)

    def isConnected(self):
        # For each edge in the graph
        # Create a set for each vertex of the edge
        # Return False, if another disjoint set is found
        for v in range(self.V):
            self.disjointSet.makeSet(v)

        for u in range(self.V):
            for v in range(self.V):
                if self.graph.isValid(u, v):
                    uf = self.disjointSet.findSet(u)
                    vf = self.disjointSet.findSet(v)

                    self.disjointSet.unionSets(uf, vf)

        # Is there more than 1 set in the disjoint set
        first = self.disjointSet.findSet(0)
        for v in range(self.V):
            vf = self.disjointSet.findSet(v)
            if vf != first:
                return False

        return True

    # Find critical edge
    # For each edge
    #   Remove edge from graph
    #   Check if the rest of the vertices still create a single disjoint set
    def solve(self):
        criticalEdges = []
        for u in range(self.V):
            for v in range(self.V):
                if self.graph.isValid(u, v):
                    self.graph.removeEdge(u, v)

                    if not self.isConnected():
                        criticalEdges.append((u, v))

                    self.graph.addEdge(u, v)

        return criticalEdges
Beispiel #2
0
    def makeKruskal(self):
        disjoint = DisjointSet()
        a = []
        soma = 0
        for node in self.nodes:
            disjoint.makeSet(node)
        sorted_edges = sorted(self.edges)
        for edge in sorted_edges:
            if disjoint.findSet(edge.node_from) != disjoint.findSet(
                    edge.node_to):
                soma += edge.weight
                a.append((edge.node_from, edge.node_to, edge.weight))
                disjoint.union(edge.node_from, edge.node_to)

        print('Caminho:')

        for edge in a:
            print(edge[0], ' -- ', edge[1], 'Peso:', edge[2])

        print('Peso do caminho gerado pelo Kruskal:', soma)