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

news/2024/10/23 5:34:24

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,dequeclass 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=0que=deque()for node in graph.keys():if inDegrees[node]==0:que.append(node)while que:node=que.popleft()topuSortArrLength+=1dp[node][ord(colors[node])-ord('a')]+=1 # 将当前node的颜色添加到状态数组中for subNode in graph[node]:inDegrees[subNode]-=1for i in range(26): # 更新子节点的每一种颜色状态dp[subNode][i]=max(dp[subNode][i],dp[node][i])if inDegrees[subNode]==0:que.append(subNode)# 如果拓扑排序的长度不等于总节点个数,则有环,直接返回-1if topuSortArrLength!=length:return -1# print(dp)# 最终状态中的最大值即为最终的结果return max([max(t) for t in dp])

4.执行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/72169.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

修改网站模板?公司网站修改文字?

要修改公司网站的模板或文字,你可以按照以下步骤操作:访问网站后台:登录到你的网站管理后台,通常是在域名后面加上 /admin 或 /wp-admin 等路径。选择页面编辑:在后台管理界面找到需要修改的文字或模板所在的页面。编辑页面内容:如果是修改文字,直接在页面编辑器中找到相…

公司网站网页修改?网站模板主页修改?

网站网页修改确定修改需求:明确需要修改的内容,如文本、图片等。 备份现有文件:在修改前备份当前网页文件,以防万一。 编辑HTML/CSS:打开需要修改的HTML文件。 根据需求修改文本、图片路径等。测试修改效果:在本地或测试服务器上预览修改后的网页,确保一切正常。 上线发…

公司网站如何修改内容?怎样修改公司网站内容?

修改公司网站的内容通常涉及以下几个步骤:登录后台管理系统:使用管理员账号登录到网站的后台管理系统。这通常是通过网站的一个特定URL进入,例如 http://yourwebsite.com/admin。导航至内容管理:在后台管理系统中找到“内容管理”或类似名称的部分。这里通常可以编辑网页上…

后台修改网站名称?后台网站底部修改?

要修改网站的名称,通常需要根据你使用的平台或框架进行不同的操作。以下是一些常见情况下的步骤: 1. 使用CMS系统(如WordPress)登录后台:首先登录到你的网站后台。 进入设置:在WordPress中,导航至“设置” > “常规”。修改站点标题:找到“站点标题”或“网站标题”…

IOCDI

​IOC springboot自动创建对象,并存起来Inversion of Control控制反转对象的创建权限交给Spring,并把创建好的对象存到容器里(其实就是一个map集合)DI Dependency Injection自动注入放到IOC容器中的对象实际就是给属性自动赋值Bean对象存到IOC容器里的对象都叫Spring Bean对象…

php模板网站怎么修改?网站模板二次修改程序?

要对PHP模板网站进行二次开发或修改,你可以遵循以下步骤来进行:熟悉模板结构首先,详细阅读模板提供的文档。 理解模板文件夹结构,通常包括HTML/CSS/JS文件以及PHP后端逻辑。备份现有代码在任何修改之前,确保完整备份当前网站的所有文件和数据库。 这一步对于防止意外丢失数…

网站后台管理如何修改?网站后台修改自己信息?

网站后台管理和修改个人信息通常涉及以下几个步骤。具体实现会根据不同的后台管理系统和技术栈有所不同,但基本流程相似。以下是一个通用的指导: 1. 登录后台管理系统访问后台管理界面:通常通过特定的URL访问,如 http://yourwebsite.com/admin。 输入登录凭证:使用管理员账…

网站后台修改图片新闻?公司网站图片怎么修改?

要修改公司网站上的图片新闻,通常可以通过以下步骤来完成:登录后台管理系统:打开网站的管理后台页面。 输入用户名和密码进行登录。定位到新闻管理模块:在后台管理界面中找到“新闻管理”、“文章管理”或类似命名的模块。 进入该模块后,查找包含需要修改图片的新闻条目。…