LeetCode——1857. 有向图中最大颜色值[Largest Color Value in a Directed Graph][困难]——分析及代码[Java]
一、题目
给你一个 有向图 ,它含有 n 个节点和 m 条边。节点编号从 0 到 n - 1 。
给你一个字符串 colors ,其中 colors[i] 是小写英文字母,表示图中第 i 个节点的 颜色 (下标从 0 开始)。同时给你一个二维数组 edges ,其中 edges[j] = [aj, bj] 表示从节点 aj 到节点 bj 有一条 有向边 。
图中一条有效 路径 是一个点序列 x1 -> x2 -> x3 -> … -> xk ,对于所有 1 <= i < k ,从 xi 到 xi+1 在图中有一条有向边。路径的 颜色值 是路径中 出现次数最多 颜色的节点数目。
请你返回给定图中有效路径里面的 最大颜色值 。如果图中含有环,请返回 -1 。
示例 1:
输入:colors = "abaca", edges = [[0,1],[0,2],[2,3],[3,4]]
输出:3
解释:路径 0 -> 2 -> 3 -> 4 含有 3 个颜色为 "a" 的节点。
示例 2:
输入:colors = "a", edges = [[0,0]]
输出:-1
解释:从 0 到 0 有一个环。
提示:
- n == colors.length
- m == edges.length
- 1 <= n <= 10^5
- 0 <= m <= 10^5
- colors 只含有小写英文字母。
- 0 <= aj, bj < n
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/largest-color-value-in-a-directed-graph
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、分析及代码
1. 拓扑排序 + 动态规划
(1)思路
对各节点进行拓扑排序,判断有向图中是否存在环,并得到节点的拓扑序列,在此基础上结合动态规划方法反向求解。
(2)代码
class Solution {
public int largestPathValue(String colors, int[][] edges) {
int n = colors.length();
int[] deg = new int[n];//各节点入度
Arrays.fill(deg, 0)