当前位置: 首页 > news >正文

lintcode-图的拓扑排序(java)

拓扑排序

  • 拓扑排序-lintcode原题
  • 题目介绍
  • 解题思路
  • 代码演示
  • 解题方法二 (参考,不用掌握)
  • 前置知识 图的拓扑序和深度优先遍历和广度优先遍历

拓扑排序-lintcode原题

127.拓扑排序-原题链接,可以点进去测试

题目介绍

描述
给定一个有向图,图节点的拓扑排序定义如下:
对于图中的每一条有向边 A -> B , 在拓扑排序中A一定在B之前.
拓扑排序中的第一个节点可以是图中的任何一个没有其他节点指向它的节点.
针对给定的有向图找到任意一种拓扑排序的顺序.

样例:
输入:
graph = {0,1,2,3#1,4#2,4,5#3,4,5#4#5}
输出:
[0, 1, 2, 3, 4, 5]
解释:
在这里插入图片描述
拓扑排序可以为:
[0, 1, 2, 3, 4, 5]
[0, 2, 3, 1, 5, 4]

您只需要返回给定图的任何一种拓扑顺序。

解题思路

我们用图的深度优先遍历去解决这个题.
由于拓扑序不唯一,但我们可以定一个标准,深度越深的节点,拓扑序越靠前.
我们用深度优先遍历,把图节点的深度都拿到,保存在一个表中,
我们再根据深度去排序,就得到递归序了,我们上代码演示.

代码演示

1.lintcode 提供的图结构

 public static class DirectedGraphNode {public int label;public ArrayList<DirectedGraphNode> neighbors;public DirectedGraphNode(int x) {label = x;neighbors = new ArrayList<DirectedGraphNode>();}}
  1. 下面代码可以直接复制进去测试
 /*** 拓扑序* @param graph* @return*/public static ArrayList<DirectedGraphNode> topSort(ArrayList<DirectedGraphNode> graph) {HashMap<DirectedGraphNode, Record> order = new HashMap<>();//拿到每个点的深度for (DirectedGraphNode node : graph){process(node,order);}//排序好的节点放进集合中  方便排序ArrayList<Record> records = new ArrayList<>();for (Record record : order.values()){records.add(record);}//使用自定义比较器去排序records.sort(new MyComparator());ArrayList<DirectedGraphNode> ans = new ArrayList<>();for (Record re : records){ans.add(re.node);}return ans;}/*** 记录每个几点的最大深度*/public static class Record{//节点DirectedGraphNode node;//深度int deep;public Record(DirectedGraphNode node, int deep) {this.node = node;this.deep = deep;}}/*** 自定义比较器,深度越深的,就排在前面.*/public static class MyComparator implements Comparator<Record>{@Overridepublic int compare(Record o1, Record o2) {return o2.deep - o1.deep;}}/*** 递归去记录每个节点的最大深度* @param node* @return*/public static Record process(DirectedGraphNode node, HashMap<DirectedGraphNode,Record>orders){//记忆化搜索,记录每次的结果,如果已经有了就直接拿结果返回.if (orders.containsKey(node)){return orders.get(node);}int deep = 0;//拿到节点最大深度for (DirectedGraphNode cur : node.neighbors){deep = Math.max(deep,process(cur,orders).deep);}Record record = new Record(node, deep + 1);orders.put(node,record);return record;}

解题方法二 (参考,不用掌握)

思路:
和方法一类似,在递归的过程中,我们不计算最大深度了,我们拿到每个点下面出现了多少次别的点.
出现点次越多的,我们认为拓扑序越靠前.
举例:
如果a点后面还有五个点,b 后面有四个点,我们认为a 的拓扑序更靠前/

直接代码展示,可以提交测试.

 /*** 排序.* @param graph* @return*/public static ArrayList<DirectedGraphNode> topSort(ArrayList<DirectedGraphNode> graph){HashMap<DirectedGraphNode, Record> map = new HashMap<>();for (DirectedGraphNode node : graph){process(node, map);}ArrayList<Record> records = new ArrayList<>();for (Record re : map.values()){records.add(re);}records.sort(new MyComparator());ArrayList<DirectedGraphNode> directedGraphNodes = new ArrayList<>();for (Record record : records){directedGraphNodes.add(record.node);}return directedGraphNodes;}/*** 记录每个点在深度遍历时 后面点出现的点次的概念*/public static class Record{public DirectedGraphNode node;public long nodes;public Record(DirectedGraphNode node, long nodes) {this.node = node;this.nodes = nodes;}}public static class MyComparator implements Comparator<Record>{@Overridepublic int compare(Record o1, Record o2) {return o1.nodes == o2.nodes ? 0 : (o1.nodes > o2.nodes ? -1 : 1);}}/*** 递归算法 计算每个点出现的点次* @param node* @param records* @return*/public static Record process(DirectedGraphNode node, HashMap<DirectedGraphNode,Record> records){if (records.containsKey(node)){return records.get(node);}long nodes = 0;for (DirectedGraphNode cur : node.neighbors){nodes += process(cur,records).nodes;}Record record = new Record(node, nodes + 1);records.put(node,record);return record;}

前置知识 图的拓扑序和深度优先遍历和广度优先遍历

图的拓扑排序(java)

图的深度优先遍历和广度优先遍历(java)

图结构-图的数据表示法(java)

相关文章:

lintcode-图的拓扑排序(java)

拓扑排序 拓扑排序-lintcode原题题目介绍解题思路代码演示解题方法二 (参考,不用掌握)前置知识 图的拓扑序和深度优先遍历和广度优先遍历 拓扑排序-lintcode原题 127.拓扑排序-原题链接,可以点进去测试 题目介绍 描述 给定一个有向图&#xff0c;图节点的拓扑排序定义如下: 对…...

【状态估计】基于随机方法优化PMU优化配置(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

Rinne Loves Graph

Rinne Loves Graph (nowcoder.com) 链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 Island 发生了一场暴乱&#xff01;现在 Rinne 要和 Setsuna 立马到地上世界去。 众所周知&#xff1a;Island 是有一些奇怪的城镇和道路构成的…...

第15章:索引的数据结构

一、为什么使用索引 1.索引是存储引擎用于快速找到记录的一种数据结构。相当于一本书的目录。在进行数据查找时&#xff0c;首先查看查询条件是否命中某条索引&#xff0c;符合则通过索引查找相关数据。如果不符合则需要全表扫描&#xff0c;一条一条查找记录&#xff0c;直到…...

机械师曙光16电脑开机自动蓝屏怎么解决?

机械师曙光16电脑开机自动蓝屏怎么解决&#xff1f;有的用户在使用机械师曙光16电脑的时候&#xff0c;遇到了一些系统问题&#xff0c;导致自己无法正常的开机使用电脑。因为电脑总会变成蓝屏&#xff0c;无法进行任何操作。那么这个情况怎么去进行问题的解决呢&#xff1f;来…...

机器学习_Lasso回归_ElasticNet回归_PolynomialFeatures算法介绍_02---人工智能工作笔记0037

Lasso回归用的是L1正则化可以看到,这里的alpha就是这里的alpha对吧,就是 L1的权重 然后对于ElasticNet回归来说,这里的alpha可以看到是L1权重的超参数对吧,然后这里的p,表示的是 L2正则里面的(1-p)这里 这里要提一下: L1和L2为什么能防止过拟合,它们有什么区别?通过添加…...

第五篇:强化学习基础之马尔科夫决策过程

你好&#xff0c;我是zhenguo(郭震) 今天总结强化学习第五篇&#xff1a;马尔科夫决策过程 基础 马尔科夫决策过程&#xff08;MDP&#xff09;是强化学习的基础之一。下面统一称为&#xff1a;MDP MDP提供了描述序贯决策问题的数学框架。 它将决策问题建模为&#xff1a; 状态…...

Oracle面试题

1. 什么是存储过程&#xff0c;使用存储过程的好处&#xff1f; 存储过程&#xff08;Stored Procedure &#xff09;是一组为了完成特定功能的SQL 语句集&#xff0c;经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数&#xff08;如果该存储过程带有参数&#…...

用Vue写教务系统学生管理

文章目录 一.首先创建新的Demo二.在APP里面绑定DemoStudent三.源码附上四.效果图&#xff08;新增记录还未实现&#xff09; 一.首先创建新的Demo 二.在APP里面绑定DemoStudent <template><img alt"Vue logo" src"./assets/logo.png"><!--…...

专门用于管理企业与自己客户之间所有信息的客户管理系统

一、开源项目简介 关于 NXCRM NXCRM 是一套基于 Laravel 的 CRM 应用程序。它包含了一个管理中心&#xff0c;可以管理用户、客户、产品、订单、商机&#xff0c;合同&#xff0c;收款&#xff0c;附件&#xff0c;联系人&#xff0c;跟进动态&#xff0c;发票&#xff0c;业…...

(转载)基于多层编码遗传算法的车间调度算法(matlab实现)

以下内容大部分来源于《MATLAB智能算法30个案例分析》&#xff0c;仅为学习交流所用。 1 理论基础 遗传算法具有较强的问题求解能力&#xff0c;能够解决非线性优化问题。遗传算法中的每个染色体表示问题中的一个潜在最优解&#xff0c;对于简单的问题来说&#xff0c;染色体…...

Redis的常用数据结构之哈希类型

首先这里说的哈希类型针对的是redis中的value的k-v结构 常见的操作命令 hset设置值 hsetnx命令&#xff0c;不存在可以设置&#xff0c;存在设置不成功 hget取值&#xff0c;这里与字符串类型不同是要精确到filed。前面的判断也是基于field来实现的 要是field没有就返回null h…...

计算机组成原理-存储系统-缓存存储器(Cache)

目录 一、Cache基本概念 1.2性能分析 二、 Cache和主存的映射发生 ​​​​​​2.1全相连映射​编辑 2.2直接映射​编辑 2.3组相连映射 三、Cachae的替换算法 3.1 随机算法(RADN) 3.2 先进先出算法(FIFO) 3.3 近期最少使用(LRU) 3.4 最近不经常使用(LFU) 四、写策略 4…...

打开c语言生成exe文件,出现闪退的解决方法

为什么打开c语言生成的exe文件&#xff0c;立马闪退。 起初个别问的时候&#xff0c;我只是简单的说明程序运行完了&#xff0c;就自动关了&#xff0c; 首先&#xff0c;生成的exe文件本质是控制台程序&#xff0c;这些都是依赖于windows的控制台窗口&#xff0c;程序执行完…...

算法基础学习笔记——⑩DFS与BFS\树与图

✨博主&#xff1a;命运之光 ✨专栏&#xff1a;算法基础学习 目录 DFS与BFS\树与图 ✨DFS ✨BFS &#x1f353;宽搜流程图如下&#xff1a; &#x1f353;宽搜流程&#xff1a; &#x1f353;广搜模板 ✨树与图 &#x1f353;树是特殊的图&#xff08;连通无环的图&am…...

chatgpt赋能python:Python中可迭代对象的介绍

Python中可迭代对象的介绍 Python是一种高级编程语言&#xff0c;它具有简单易学、可读性强、功能强大等特点&#xff0c;成为了数据科学、机器学习、Web开发等领域的热门选择。Python中有很多重要的概念和功能&#xff0c;其中之一就是支持可迭代对象的概念。 在Python中&am…...

报表控件FastReport使用指南——如何打开WebP格式的图片

FastReport 是功能齐全的报表控件&#xff0c;可以帮助开发者可以快速并高效地为.NET&#xff0c;VCL&#xff0c;COM&#xff0c;ActiveX应用程序添加报表支持&#xff0c;由于其独特的编程原则&#xff0c;现在已经成为了Delphi平台最优秀的报表控件&#xff0c;支持将编程开…...

【鲁棒、状态估计】用于电力系统动态状态估计的鲁棒迭代扩展卡尔曼滤波器研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

整理6个超好用的在线编辑器!

随着 Web 开发对图像可扩展性、响应性、交互性和可编程性的需求增加&#xff0c;SVG 图形成为最适合 Web 开发的图像格式之一。它因文件小、可压缩性强并且无论如何放大或缩小&#xff0c;图像都不会失真而受到欢迎。然而&#xff0c;为了编辑 SVG 图像&#xff0c;需要使用 SV…...

ArcGIS10.8下载及安装教程(附安装步骤)

谷歌云&#xff1a; https://drive.google.com/drive/folders/10igu7ZSMaR0v0WD7-2W-7ADJGMUFc2ze?uspsharing ArcGIS10.8 百度网盘&#xff1a; https://pan.baidu.com/s/1s5bL3QsCP5sgcftCPxc88w 提取码&#xff1a;kw4j 阿里云&#xff1a; https://www.aliyundriv…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

基于Python的气象数据分析及可视化研究

目录 一.&#x1f981;前言二.&#x1f981;开源代码与组件使用情况说明三.&#x1f981;核心功能1. ✅算法设计2. ✅PyEcharts库3. ✅Flask框架4. ✅爬虫5. ✅部署项目 四.&#x1f981;演示效果1. 管理员模块1.1 用户管理 2. 用户模块2.1 登录系统2.2 查看实时数据2.3 查看天…...

生信服务器 | 做生信为什么推荐使用Linux服务器?

原文链接&#xff1a;生信服务器 | 做生信为什么推荐使用Linux服务器&#xff1f; 一、 做生信为什么推荐使用服务器&#xff1f; 大家好&#xff0c;我是小杜。在做生信分析的同学&#xff0c;或是将接触学习生信分析的同学&#xff0c;<font style"color:rgb(53, 1…...