首页 > 其他分享 >Leetcode 1857. 有向图中最大颜色值

Leetcode 1857. 有向图中最大颜色值

时间:2024-10-16 10:32:13浏览次数:20  
标签:node 有向图 拓扑 Leetcode subNode 排序 1857 节点 dp

1.题目基本信息

1.1.题目描述

给你一个 有向图 ,它含有 n 个节点和 m 条边。节点编号从 0 到 n – 1 。

给你一个字符串 colors ,其中 colors[i] 是小写英文字母,表示图中第 i 个节点的 颜色 (下标从 0 开始)。同时给你一个二维数组 edges ,其中 edges[j] = [a_j, b_j] 表示从节点 a_j 到节点 b_j 有一条 有向边 。

图中一条有效 路径 是一个点序列 x_1 -> x_2 -> x_3 -> … -> x_k ,对于所有 1 <= i < k ,从 x_i 到 x_i+1 在图中有一条有向边。路径的 颜色值 是路径中 出现次数最多 颜色的节点数目。

请你返回给定图中有效路径里面的 最大颜色值 。如果图中含有环,请返回 -1 。

1.2.题目地址

https://leetcode.cn/problems/largest-color-value-in-a-directed-graph/description/

2.解题方法

2.1.解题思路

拓扑排序+动态规划

2.2.解题步骤

第一步,状态构建;dp[i][j]为以i节点结尾的路径的颜色j的最大数量

第二步,构建邻接表和入度表(注意初始化图,边并不一定会包括所有的节点)

第三步,先获取拓扑排序,再在过程中进行状态转移;同时获取拓扑排序的长度,用来判断有无环

  • 其中,状态转移方程:dp[i][j]=max([dp[node][j]+nodeIIsJColor(j) for node in prev(i)])
  • 如果拓扑排序的长度不等于总节点个数,则有环,直接返回-1

最终状态dp中的最大值即为最终的结果

3.解题代码

Python代码

from collections import defaultdict,deque

class Solution:
    def largestPathValue(self, colors: str, edges: List[List[int]]) -> int:
        length=len(colors)
        # 第一步,状态构建;dp[i][j]为以i节点结尾的路径的颜色j的最大数量
        dp=[[0]*26 for _ in range(length)]
        # 第二步,构建邻接表和入度表(注意初始化图,边并不一定会包括所有的节点)
        graph={i:[] for i in range(length)}
        inDegrees=defaultdict(int)
        for from_,to_ in edges:
            graph[from_].append(to_)
            inDegrees[to_]+=1
        # 第三步,先获取拓扑排序,再在过程中进行状态转移;同时获取拓扑排序的长度,用来判断有无环
        # 其中,状态转移方程:dp[i][j]=max([dp[node][j]+nodeIIsJColor(j) for node in prev(i)])
        topuSortArrLength=0
        que=deque()
        for node in graph.keys():
            if inDegrees[node]==0:
                que.append(node)
        while que:
            node=que.popleft()
            topuSortArrLength+=1
            dp[node][ord(colors[node])-ord('a')]+=1 # 将当前node的颜色添加到状态数组中
            for subNode in graph[node]:
                inDegrees[subNode]-=1
                for i in range(26): # 更新子节点的每一种颜色状态
                    dp[subNode][i]=max(dp[subNode][i],dp[node][i])
                if inDegrees[subNode]==0:
                    que.append(subNode)
        # 如果拓扑排序的长度不等于总节点个数,则有环,直接返回-1
        if topuSortArrLength!=length:
            return -1
        # print(dp)
        # 最终状态中的最大值即为最终的结果
        return max([max(t) for t in dp])

4.执行结果

在这里插入图片描述

标签:node,有向图,拓扑,Leetcode,subNode,排序,1857,节点,dp
From: https://www.cnblogs.com/geek0070/p/18469304

相关文章

  • Leetcode刷题
    本题思路:采用线性枚举,遍历数组暴力解题分析:首先我们定义两个变量p和count,p用来记录0之前1的个数,例如在示例1中我们的p遍历完数组后的值先为2,遇到0断开,将p重新变为0,之后值为3。而count则记录最长1有几个,在第一次中p等于2,此时count也等于2,当p重新为0时,count还是等于2......
  • [LeetCode] 662. 二叉树最大宽度
    题目描述:给你一棵二叉树的根节点 root ,返回树的 最大宽度 。树的 最大宽度 是所有层中最大的 宽度 。每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树结构相同,两端点间会出现一些延伸到这一层的 null 节点,这......
  • (nice!!!)(LeetCode) 1884. 鸡蛋掉落-两枚鸡蛋(动态规划 dfs递归和递推 || 数学)
    题目:1884.鸡蛋掉落-两枚鸡蛋方法一:动态规划dp+递归dfs+记忆化搜索。时间复杂度0(n^2)。C++版本:classSolution{public: //状态sta[i]表示:i层找到f所需要的最小操作次数intsta[1010];inttwoEggDrop(intn){ //层数为0时,直接返回0if(n==0......