A bit more complex solution
example = [[-4,1],[1,5],[2,10],[3,5],[1,3],[3,8],[8,12],[5,11]]
# we create a simple tree structure
tree = {}
for v2 in example:
tree[tuple(v2)] = ([v3 for v3 in example if v3[0] == v2[1]],
[v3 for v3 in example if v3[1] == v2[0]])
def is_ancestor(n1, n2, tree):
"""check if a node is ancestral to another"""
if n1 in tree[tuple(n2)][1]:
return True
for n3 in tree[tuple(n2)][1]:
return is_ancestor(n1, n3, tree)
return False
def get_longest(example, tree, result=None, v=None):
"""searches for longest path"""
if not result:
result = [[v]]
for desc in tree[tuple(v)][0]:
if result[-1][-1] not in tree[tuple(desc)][1]:
result.append([r for r in result[-1]
if is_ancestor(r, desc, tree)])
result[-1].append(desc)
get_longest(example, tree, result, desc)
return result
# check from each starting point
max_dist = 0
for n in example:
for intervals in get_longest(example, tree, [], n):
print (intervals, intervals[-1][1] , intervals[0][0])
dist = intervals[-1][1] - intervals[0][0]
if dist > max_dist:
max_dist = dist
print(max_dist)