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
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)