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

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

时间:2024-10-16 10:32:13浏览次数:9  
标签: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 1489. 找到最小生成树里的关键边和伪关键边
    1.题目基本信息1.1.题目描述给你一个n个点的带权无向连通图,节点编号为0到n-1,同时还有一个数组edges,其中edges[i]=[fromi,toi,weighti]表示在fromi和toi节点之间有一条带权无向边。最小生成树(MST)是给定图中边的一个子集,它连接了所有节点且没有环,而且这些边......
  • leetcode 刷题day43动态规划Part12(115.不同的子序列、583. 两个字符串的删除操作、72.
    115.不同的子序列思路:这个题还是比较有难度的,问题s中有多少个t子序列可以转化为s字符串中有多少删除元素的方式,使s可以变成t。考虑动规五部曲。1、确定dp数组(dptable)以及下标的含义dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。2、确定递推公式......
  • leetcode 刷题day42动态规划Part11(1143.最长公共子序列、1035.不相交的线、53. 最大子
    1143.最长公共子序列思路:718.最长重复子数组两个数组对应相同且连续,所以递推公式是dp[i-1][j-1]+1。最长公共子序列不要求连续但要求相对顺序,差别主要在于递推公式。对于该题主要有两大情况:text1[i-1]与text2[j-1]相同,text1[i-1]与text2[j-1]不相同。如果te......
  • Leetcode刷题
    本题思路:采用线性枚举,遍历数组暴力解题分析:首先我们定义两个变量p和count,p用来记录0之前1的个数,例如在示例1中我们的p遍历完数组后的值先为2,遇到0断开,将p重新变为0,之后值为3。而count则记录最长1有几个,在第一次中p等于2,此时count也等于2,当p重新为0时,count还是等于2......
  • LeetCode刷题日记之回溯算法(四)
    目录前言非递减子序列全排列全排列II总结前言今天是学习回溯算法的第四天,我们继续来一起学习回溯算法蕴含的逻辑处理,希望博主记录的内容能够对大家有所帮助,一起加油吧朋友们!......
  • [LeetCode] 662. 二叉树最大宽度
    题目描述:给你一棵二叉树的根节点 root ,返回树的 最大宽度 。树的 最大宽度 是所有层中最大的 宽度 。每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树结构相同,两端点间会出现一些延伸到这一层的 null 节点,这......
  • Leetcode_exercise_01
    题目两数之和枚举所有可能的两个不同的数字之和,与target做比较。哈希表查询//方法一:classSolution{public:vector<int>twoSum(vector<int>&nums,inttarget){intn=nums.size();for(inti=0;i<n;++i){......
  • (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......
  • 闯关leetcode——94. Binary Tree Inorder Traversal
    大纲题目地址内容解题代码地址题目地址https://leetcode.com/problems/binary-tree-inorder-traversal/description/内容Giventherootofabinarytree,returntheinordertraversalofitsnodes’values.Example1:Input:root=[1,null,2,3]Outpu......
  • 闯关leetcode——100. Same Tree
    大纲题目地址内容解题代码地址题目地址https://leetcode.com/problems/same-tree/description/内容Giventherootsoftwobinarytreespandq,writeafunctiontocheckiftheyarethesameornot.Twobinarytreesareconsideredthesameifthey......