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