此题解首先通过拓扑排序检测有向图中是否存在环。如果存在环,则无法找到一个有效的顺序来处理节点,返回-1。使用拓扑排序后的节点序列,通过动态规划的方法计算各个路径的最大颜色值。对每种颜色,维护一个数组记录到达每个节点时该颜色的最大计数。遍历节点时,更新这些计数,并在所有子节点传播当前节点的颜色值计数。最终,对所有颜色进行扫描,找到出现次数最多的颜色的节点数目。
时间复杂度: O(n + m + n * c)
空间复杂度: O(n + m + n * c)
from collections import deque
from typing import List
class Solution:
def typology(self, n: int, graph: List[List[int]]) -> List[int]:
ind = [0] * n # 存储每个节点的入度
for start, adj_arr in enumerate(graph):
for adj in adj_arr:
ind[adj] += 1
q = deque()
for i, d in enumerate(ind):
if d == 0:
q.append(i)
ans = []
while q:
node = q.popleft()
ans.append(node)
for adj in graph[node]:
ind[adj] -= 1
if ind[adj] == 0:
q.append(adj)
return ans if len(ans) == n else []
def largestPathValue(self, colors: str, edges: List[List[int]]) -> int:
n = len(colors)
if not n:
return 0
graph = [[] for _ in range(n)]
for start, end in edges:
graph[start].append(end)
sorted_nodes = self.typology(n, graph)
if not sorted_nodes:
return -1
ans = 0
for color in set(colors):
fn = [0] * n # 记录到达每个节点时该颜色的最大计数
for i in range(n):
node_id = sorted_nodes[i]
if colors[node_id] == color:
fn[node_id] = fn[node_id] + 1
for adj in graph[node_id]:
fn[adj] = max(fn[adj], fn[node_id]) # 更新邻接节点的颜色计数
ans = max(ans, *fn)
return ans
# Example usage:
# print(Solution().largestPathValue('eeyyeeyeye', [[0, 1], [1, 2], [2, 3], [3, 4], [4, 5], [4, 6], [5, 7], [6, 8], [8, 9]]))