from collections import defaultdict
import sys
sys.setrecursionlimit(10**6)
def solve(N, M, edges):
longest = {}
def get_longest(start):
if start in longest:
return longest[start]
next_edges = edges.get(start)
if not next_edges:
ret = 0
else:
ret = max(get_longest(v) for v in edges[start]) + 1
longest[start] = ret
return ret
return max(get_longest(v) for v in edges)
def main():
N, M = map(int, input().split())
edges = defaultdict(set)
for i in range(M):
v1, v2 = map(int, input().split())
edges[v1].add(v2)
print(solve(N, M, edges))
main()
def solve(N, M, edges):
longest = [-1] * (N + 1)
for i in range(N + 1):
if not edges[i]:
longest[i] = 0
def get_longest(start):
ret = longest[start]
if ret != -1:
return ret
next_edges = edges.get(start)
if not next_edges:
ret = 0
else:
ret = max(get_longest(v) for v in edges[start]) + 1
longest[start] = ret
return ret
return max(get_longest(v) for v in edges)
cdef get_longest(long start, dict edges, long[:] longest):
if longest[start] != -1:
return longest[start]
cdef list next_edges
next_edges = edges.get(start)
if not next_edges:
ret = 0
else:
#ret = max(get_longest(v, edges, longest) for v in edges[start]) + 1
ret = 0
for v in edges[start]:
x = get_longest(v, edges, longest) + 1
if x > ret:
ret = x
longest[start] = ret
return ret
def solve(N, M, edges):
cdef array.array longest = pyarray.array('l', [-1] * (N + 1))
return max(get_longest(v, edges, longest) for v in edges)
Compilation is falling back to object mode WITH looplifting enabled because Function "get_longest" failed type inference due to: non-precise type pyobject
def solve(N, M, edges):
longest = {}
stack = [v for v in edges]
while stack:
v = stack.pop()
if v > 0:
if v in longest:
continue
next_edges = edges.get(v)
stack.append(-v)
if next_edges:
stack.extend(next_edges)
else:
next_edges = edges.get(-v)
if not next_edges:
ret = 0
else:
ret = max(longest[x] for x in next_edges) + 1
longest[-v] = ret
return max(longest[v] for v in edges)