[
bfs
dfs
graph algo
topological sort
dp
]
Leetcode 1857. Largest Color Value in a Directed Graph
Problem statement
https://leetcode.com/problems/largest-color-value-in-a-directed-graph/
Solution
First, we use topological sort to check if we have loops. Then for each symbol s, we denote by dp[i]
the maximum number of letters s
in paths, ending with i
. Because we already did topological sort, no need to use memoisation, we can traverse nodes in correct order. For each i
we need to check all nodes j
from which we can go to i
and choose the maximum one plus indicator that C[i] == s
.
Complexity
Total time complexity is O(26*(n+m))
, where n
is number of nodes and m
is number of edges. Space complexity is O(n)
.
Code
class Solution:
def largestPathValue(self, C, edges):
n, ans = len(C), 0
pre, suc = defaultdict(int), defaultdict(list)
for a, b in edges:
pre[a] += 1
suc[b].append(a)
free, out = set(range(n)) - set(pre), []
while free:
a = free.pop()
out.append(a)
for b in suc[a]:
pre[b] -= 1
if not pre[b]: free.add(b)
if len(out) != n: return -1
for s in set(C):
res = [0]*n
for i in out[::-1]:
res[i] = max([res[j] for j in suc[i]] or [0]) + int(C[i] == s)
ans = max(ans, max(res))
return ans
We can do the second part using lru_cache
. Be careful, if we change order of for loop for s
and i
, we will get TLE: because we need to jump a lot in indexes.
@lru_cache(None)
def dp(node, s):
return max([dp(i, s) for i in suc[node]] or [0]) + int(C[node] == s)
for s in set(C):
for i in range(n):
ans = max(ans, dp(i, s))
return ans