lintcode-图的拓扑排序(java)

news2024/9/20 5:51:39

拓扑排序

  • 拓扑排序-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>{

        @Override
        public 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>{

        @Override
        public 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)

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

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

相关文章

【利用AI让知识体系化】拍了拍AST

文章目录 I. 介绍什么是抽象语法树&#xff08;AST&#xff09;AST 和编译器的关系AST 在前端开发中的应用 II. 构建 AST词法分析器&#xff08;Lexer&#xff09;的作用语法分析器&#xff08;Parser&#xff09;的作用如何使用工具生成 AST III. AST 的结构AST 的节点类型如何…

深度学习 - 51.推荐场景下的 Attention And Multi-Head Attention 简单实现 By Keras

目录 一.引言 二.计算流程 1.Attention 结构 2.Multi-Head Attention 结构 三.计算实现 1.Item、序列样本生成 2.OwnAttention Layer 实现 2.1 init 初始化 2.2 build 参数构建 2.3 call 逻辑调用 3.OwnAttention Layer 测试 四.总结 一.引言 Attention And Multi…

minio在window和linux下部署权限控制添加,JAVA代码实现

minio部署启用 参考官方&#xff0c;根据不同的操作系统&#xff0c;按照步骤部署 minio官网地址https://www.minio.org.cn/docs/minio/windows/index.html minio权限添加 minio权限添加https://blog.csdn.net/xnian_/article/details/130841657 windows环境部署 安装最小I…

chatgpt赋能python:Python与USB的结合——打造更高效的设备连接

Python与USB的结合——打造更高效的设备连接 Python作为一门广泛应用于各个领域的编程语言&#xff0c;在计算机硬件设备方面也有着广泛的运用。在设备连接这一领域中&#xff0c;Python的成功案例就是其与USB的结合。 什么是USB&#xff1f; USB即通用串行总线&#xff08;…

win11 重装 NVIDIA 驱动

文章目录 win11 重装 NVIDIA 驱动1. 安装并使用驱动卸载工具 DDU2. 下载并安装 NVIDIA Toolkit3. 查看 CUDA 版本 win11 重装 NVIDIA 驱动 1. 安装并使用驱动卸载工具 DDU 浏览器搜索并下载安装 DDU win R 输入 msconfig 进入安全模式 重启后在安全模式下打开 DDU 完成卸…

讯飞星火_VS_文心一言

获得讯飞星火认知大模型体验授权&#xff0c;第一时间来测试一下效果&#xff0c;使用申请手机号登录后&#xff0c;需要同意讯飞SparkDesk体验规则&#xff0c;如下图所示&#xff1a; 同意之后就可以进行体验了&#xff0c;界面如下&#xff1a; 讯飞星火效果体验 以下Promp…

JavaScript实现循环读入整数进行累加,直到累加的和大于1000为止的代码

以下为实现循环读入整数进行累加&#xff0c;直到累加的和大于1000为止的程序代码和运行截图 目录 前言 一、循环读入整数进行累加&#xff0c;直到累加的和大于1000为止 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有选择&#xff0…

day3 - 图像在不同色彩空间间的转换

本期将了解三种不同的颜色空间&#xff0c;RGB&#xff0c;HSV&#xff0c;GRAY。会使用OpenCV来读取三种颜色空间&#xff0c;并且操作不同空间的转换&#xff0c;观察不同颜色空间的特点。 完成本期内容&#xff0c;你可以&#xff1a; 了解RGB&#xff0c;HSV&#xff0c;G…

雷达中的无源和有源的区别

常规雷达探测目标时&#xff0c;需要源源不断地发射无线电波&#xff0c;所以叫有源雷达( active radar)。有源雷达的优点是能自主搜索目标&#xff0c;因为它接收的是自己发射的电磁波&#xff0c;所以灵敏度高&#xff0c;分辨率好。但这种雷达易受目标的电磁干扰&#xff0c…

chatgpt赋能python:Python:一门强大的编程语言

Python&#xff1a;一门强大的编程语言 Python是一款高级编程语言&#xff0c;以其简单易用和多功能而闻名于世。Python首次发布于1989年&#xff0c;如今已成为许多开发者的首选编程语言。Python特别适合于数据处理、机器学习、人工智能等领域。 为什么选择Python&#xff1…

chatgpt赋能python:PythonWMS:优化仓库管理的新选择

Python WMS: 优化仓库管理的新选择 在现代商业环境中&#xff0c;仓库管理对于公司的供应链管理至关重要。然而&#xff0c;传统的仓库管理系统&#xff08;WMS&#xff09;经常过于复杂或桎梏化&#xff0c;不能适应快速变化的市场需求。现在&#xff0c;随着Python WMS的出现…

jQuery-基本过滤器

<!DOCTYPE HTML> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8"> <title>基本过滤器</title> <style type"text/css"> …

Ubuntu安装RabbitMQ server - 在外远程访问

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 转载自cpolar内网穿透的文章&#xff1a;无公网IP&…

MyBatis-Plus_04 代码生成器、多数据源(主从)、MyBatisX插件

目录 ①. 代码生成器 ②. 多数据源&#xff08;主从&#xff09; ③. MyBatisX ①. 代码生成器 添加代码生成器依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.1&…

chatgpt赋能python:PythonTika:解析各种格式的文档

Python Tika: 解析各种格式的文档 简介 Python Tika是一个基于Apache Tika的Python库&#xff0c;可以解析各种格式的文档&#xff0c;如PDF、Microsoft Office、OpenOffice、XML、HTML、TXT等等。它提供了一种非常方便的方法来获取文档内容&#xff0c;包括元数据、正文、各…

Vue(Vuex插件)

一、Vuex的介绍 1. 概念 专门在Vue中实现集中式状态数据管理的一个Vue插件&#xff0c;对Vue的应用中多个组件的共享状态进行集中式的管理(读/写)&#xff0c;也是一种组件间通信的方式&#xff0c;且适用于任意组件间通信。 2. 了解vuex地址 https://github.com/vuejs/vuexh…

BLIP-2:salesforce提出基于冻结视觉编码器和LLM模型参数的高效训练多模态大模型

论文链接&#xff1a;https://arxiv.org/abs/2301.12597 项目代码&#xff1a;https://github.com/salesforce/LAVIS/tree/main/projects/blip2 体验地址&#xff1a;https://huggingface.co/spaces/Salesforce/BLIP2 文档介绍&#xff1a;https://huggingface.co/docs/tran…

浅谈数据中心供配电设计应用以及监控产品选型

摘 要&#xff1a;近年来&#xff0c;随着数据中心的迅猛发展&#xff0c;数据中心的能耗问题也越来越突出&#xff0c;有关数据中心的能源管理和供配电设计已经成为热门问题&#xff0c;合理可靠的数据中心配电系统方案&#xff0c;是提高数据中心电能使用效率&#xff0c;降低…

图片翻译怎么弄?如何把图片翻译成中文?

在使用社交媒体时&#xff0c;可能会遇到来自世界各地的异文化信息&#xff0c;这时我们可以借助图片翻译的方法帮助我们更好地了解这些信息&#xff0c;促进跨文化交流。那么图片翻译怎么弄呢&#xff1f;图片翻译的方法有哪些呢&#xff1f;这篇文章给你推荐三个非常好用的图…