Ejemplo n.º 1
0
    def solution(self, G):
        edges = []
        for node in G.V.values():
            for next,weight in node.neighbors:
                if next.x > node.x:
                    edge = [node.x, next.x, weight]
                else:
                    edge = [next.x, node.x, weight]
                edges.append(edge)
        edges = sorted(edges, cmp = lambda x,y : (x[0] - y[0]) * 100 + (x[1]-y[1])*10 + int(x[2] - y[2]))
        cleared = [edges[0]]
        prev = edges[0]
        for edge in edges:
            if prev == edge:
                continue
            else:
                prev = edge
                cleared.append(edge)

        dset = DisjointSet()
        for node in G.V.values():
            dset.makeset(node.x)

        edges = sorted(cleared, key= lambda x:x[2])
        tree = []
        for edge in edges:
            u, v, weight = edge
            if not dset.findset(u).equals( dset.findset(v) ):
                dset.union(u,v)
                tree.append( edge )
        return tree
Ejemplo n.º 2
0
    def solution(self, G):
        edges = []
        for node in G.V.values():
            for next, weight in node.neighbors:
                if next.x > node.x:
                    edge = [node.x, next.x, weight]
                else:
                    edge = [next.x, node.x, weight]
                edges.append(edge)
        edges = sorted(edges,
                       cmp=lambda x, y: (x[0] - y[0]) * 100 +
                       (x[1] - y[1]) * 10 + int(x[2] - y[2]))
        cleared = [edges[0]]
        prev = edges[0]
        for edge in edges:
            if prev == edge:
                continue
            else:
                prev = edge
                cleared.append(edge)

        dset = DisjointSet()
        for node in G.V.values():
            dset.makeset(node.x)

        edges = sorted(cleared, key=lambda x: x[2])
        tree = []
        for edge in edges:
            u, v, weight = edge
            if not dset.findset(u).equals(dset.findset(v)):
                dset.union(u, v)
                tree.append(edge)
        return tree
Ejemplo n.º 3
0
class C21_3_OfflineLCA(BaseSolution):
    def __init__(self):
        BaseSolution.__init__(self)
        self.push_test(
            params = (TreeNode.deserialize("{1,2,3,4,5,6,7}"), [[5,4],[4,6], [5,3],[4,2]],),
            expects = [2,1,1,2]
        )
        self.push_test(
            params = (TreeNode.deserialize("{1,2,3,4,5,6,7,#,#,8,9,#,#,10,#,#,11,12,#,13,14}"), [[1,4],[2,3],[5,6],[11,12],[12,7],[6,14]],),
            expects = [1,1,1,5,1,3]
        )

    def solution(self, root, queries):
        self.queries = {}
        self.tree = self.bfs(root)
        for idx, query in enumerate(queries):
            if query[0] not in self.queries:
                self.queries[ query[0] ] = []
            if query[1] not in self.queries:
                self.queries[ query[1] ] = []
            self.queries[query[0]].append( (idx,query[1]) )
            self.queries[query[1]].append( (idx,query[0]) )
        self.result = { }
        self.dset = DisjointSet()
        self.lca(root)
        return self.result.values()
    def bfs(self,root):
        tree = {}
        queue = [root]
        while len(queue) > 0:
            top = queue.pop(0)
            if not top: continue
            tree[top.val] = top
            if top.left: queue.append(top.left)
            if top.right: queue.append(top.right)

        return tree
    def lca(self,root):
        u = self.dset.makeset( root.val )
        self.dset.findset(root.val).ancestor = u
        for node in (root.left, root.right):
            if not node: continue
            self.lca(node)
            self.dset.union( root.val, node.val)
            self.dset.findset(root.val).ancestor = u
        root.state = 2
        if root.val in self.queries:
            for idx,other in self.queries[ root.val ]:
                if self.tree[other].state == 2:
                    self.result[idx] = self.dset.findset( other ).ancestor.val
Ejemplo n.º 4
0
Archivo: ds.py Proyecto: florencioq/eda
from DisjointSet import *

print("Criando o conjunto com subconjuntos disjuntos")
myDS = DisjointSet()
print("Criando uns subconjuntos")
for i in range(5):
    myDS.makeset(i)
print("Printando os conjuntos")
myDS.print()
print("Unindo R conjuntos 1 e 2")
myDS.uniaoR(1, 2)
myDS.print()
print("Unindo R conjuntos 1 e 3")
myDS.uniaoR(1, 3)
myDS.print()
print("Unindo R conjuntos 0 e 1")
myDS.uniaoR(0, 1)
myDS.print()
print("Retornando o representante dos elementos")
for i in range(5):
    print(str(i) + "-->" + str(myDS.find(i)))
print("Verificando se 1 e 2 fazem parte do mesmo conjunto")
print(myDS.mesmo(1, 2))
print("Verificando se 1 e 4 fazem parte do mesmo conjunto")
print(myDS.mesmo(1, 4))
print("União E de 1 e 4")
myDS.print()
myDS.uniaoE(1, 4)
myDS.print()