新农上路
- 积分
- 99
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2011-11-7
- 最后登录
- 1970-1-1
|
- # coding=utf-8
- """
- 找出有零或一个parent 的node
- input是一个二维array represent the parentChildPairs,
- 每个pair input[0] 是input[1] 的parent,比如 {{1,2}}
- 表示1 是2 的parent.
- """
- from collections import defaultdict
- def find_zero_one_parent_nodes(arr):
- ct = defaultdict(set)
- for p, c in arr:
- ct[c].add(p)
-
- res = set()
- for p, c in arr:
- if p not in ct:
- res.add(p)
- if len(ct[c]) == 1:
- res.add(c)
- return res
- import unittest
- class Test(unittest.TestCase):
- def test_1(self):
- arr = [(1, 2), (1, 2), (2, 3), (1, 3)]
- actual = find_zero_one_parent_nodes(arr)
- expect = set([1, 2])
- self.assertEqual(actual, expect)
- print(actual)
- if __name__ == '__main__':
- unittest.main(verbosity=2)
复制代码
- # coding=utf-8
- """
- 找出有零或一个parent 的node
- input是一个二维array represent the parentChildPairs,
- 每个pair input[0] 是input[1] 的parent,比如 {{1,2}}
- 表示1 是2 的parent.
- 找出两个node是否有共同的祖先
- """
- from collections import defaultdict
- from collections import deque
- def have_common_ancestor(arr, p1, p2):
- cp_graph = defaultdict(set)
- for p, c in arr:
- cp_graph[c].add(p)
- p1_ancestors = get_ancestors(cp_graph, p1)
- p2_ancestors = get_ancestors(cp_graph, p2)
- return bool(p1_ancestors & p2_ancestors)
- def get_ancestors(cp_graph, p):
- visited = set()
- queue = deque([p])
- res = set()
- while queue:
- n = queue.popleft()
- res.add(n)
- for nxt in cp_graph.get(n) or []:
- if nxt not in visited:
- visited.add(nxt)
- queue.append(nxt)
- return res
- import unittest
- class Test(unittest.TestCase):
- def test_1(self):
- arr = [(1, 2), (1, 2), (2, 3), (1, 3)]
- actual = have_common_ancestor(arr, 1, 2)
- expect = True
- self.assertEqual(actual, expect)
- print(actual)
- def test_2(self):
- arr = [(1, 2), (1, 2), (2, 3), (1, 3)]
- actual = have_common_ancestor(arr, 1, 4)
- expect = False
- self.assertEqual(actual, expect)
- print(actual)
- def test_3(self):
- arr = [(1, 2), (1, 2), (2, 3), (1, 3), (4, 5), (5, 6)]
- actual = have_common_ancestor(arr, 2, 6)
- expect = False
- self.assertEqual(actual, expect)
- print(actual)
- if __name__ == '__main__':
- unittest.main(verbosity=2)
复制代码
- # coding=utf-8
- """
- 找出有零或一个parent 的node
- input是一个二维array represent the parentChildPairs,
- 每个pair input[0] 是input[1] 的parent,比如 {{1,2}}
- 表示1 是2 的parent. no cycle
- 找出最远距离的祖先
- """
- from collections import defaultdict
- from collections import deque
- def farest_ancestors(arr, n):
- cp_graph = defaultdict(set)
- for p, c in arr:
- cp_graph[c].add(p)
- print(cp_graph)
- p_ancestors = get_farest_ancestors(cp_graph, n)
- return p_ancestors
- def get_farest_ancestors(cp_graph, node):
- queue = deque([node])
- res = set([node])
- while queue:
- len_queue = len(queue)
- res.clear()
- for _ in range(len_queue):
- n = queue.popleft()
- res.add(n)
- for nxt in cp_graph.get(n) or []:
- queue.append(nxt)
- return res
- import unittest
- class Test(unittest.TestCase):
- def test_1(self):
- arr = [(1, 2), (1, 2), (2, 3), (1, 3)]
- actual = farest_ancestors(arr, 3)
- expect = set([1])
- print(actual)
- self.assertEqual(actual, expect)
- def test_2(self):
- arr = [(1, 2), (1, 2), (2, 3), (1, 3)]
- actual = farest_ancestors(arr, 4)
- expect = set([4])
- print(actual)
- self.assertEqual(actual, expect)
- def test_3(self):
- arr = [(1, 2), (1, 2), (2, 3), (1, 3), (4, 5), (5, 6)]
- actual = farest_ancestors(arr, 6)
- expect = set([4])
- print(actual)
- self.assertEqual(actual, expect)
- def test_4(self):
- arr = [(1, 2), (3, 2), (4, 1), (5, 3)]
- actual = farest_ancestors(arr, 2)
- expect = set([4, 5])
- print(actual)
- self.assertEqual(actual, expect)
- if __name__ == '__main__':
- unittest.main(verbosity=2)
复制代码 |
|