拓扑排序【邻接矩阵邻接表】

news2024/11/24 9:18:43

拓扑排序

在这里插入图片描述

TuoPuSort

一、概念

我们再说拓扑排序时,我们首先了解下​DAG

将有向无环图G=(V,E)中的所有顶点排成一个线性序列,使图中任意一对顶点u,v,之间不存在环路

DAG是一种特殊的有向图,它由一组顶点和一组有向边组成,且不存在任何环路。

  • 每个顶点表示一个任务或操作,而有向边表示任务之间的依赖关系。
  • 在有向无环图中,从任意顶点出发沿着有向边行走,不会回到起始顶点。

拓扑排序:

看完上面,我们说下拓扑排序,这玩意儿的出现就是针对有向无环图,通过此算法,找出邮箱无环图的序列

注意: 拓扑排序的序列是不唯一的

算法描述:

使用邻接矩阵的代码如下: 【不懂,就画图,每个新序列按照一步步去拆解】

 /**
  * @param1: 邻接矩阵,adjMatrix[i][j] = 0 表示节点 i 和 j 之间没有边直接相连
  * @return: 拓扑序列
  * @description: 对用邻接表 adjMatrix 表示的图进行拓扑排序
  */
 public static int[] tuopuSort(int[][] adjMatrix){
     //n表示图中的节点数
     int n=adjMatrix.length;
     //计算图中每个节点的入度,inDegree[i]=j 表示节点i 的入度为j
     int[] inDegree=new int[n];
     for(int j=0;j<n;j++){
         for(int i=0;i<n;i++){
             if(adjMatrix[i][j]!=0){
                 inDegree[j]++;
             }
         }
     }
     //将入度为0的节点加入到队列中
     Queue<Integer> queue=new LinkedList<>();
     for(int i=0;i<n;i++){
         if(inDegree[i]==0){
             queue.offer(i);
         }
     }
     //记录拓扑序列
     int[] order=new int[n];
     //记录遍历节点的顺序
     int cnt=0;
     //通过BFS算法完成拓扑序列
     while(!queue.isEmpty()){
         //取出队首节点
         int cur=queue.poll();
         //取出节点的顺序即为拓扑排序的结果
         order[cnt]=cnr;
         cnt++;
         //遍历当前节点cur所指向的所有节点
         for(int next=0;next<n;next++){
             if(adjMatrix[cur][next]!=0){
                 //去掉cur指向next的边,故next的入度减1
                 inDegree[next]--;
                 //将入度为0的节点再次加入队列
                 if(inDegree[next]==0){
                     queue.offer(next);
                 }
             }
         }
     }
     if(cnt!=n){
         //图中存在环,拓扑排序不存在
         return new int[]{};
     }else{
         return order;
     }
 }

使用邻接表

 /**
  * @param1: 邻接表,adjList[i] 中存储节点 i 指向的节点
  * @param2: 图的节点数
  * @return: 拓扑序列
  * @description: 对用邻接表 adjList 表示的图进行拓扑排序
  */
 public static int[] tuopuSort(List<Integer>[] adjList,int n){
     //计算图中每个节点的入度,inDegree[i]=j表示节点i的入度为j
     int[] inDegree=new int[n];
     for(List<Integer> list:adjList){
         for(Integer node: list){
             inDegree[node]++;
         }
     }
     //将入度为0的节点加入到队列中
     Queue<Integer> queue=new LinkedList<>();
     for(int i=0;i<n;i++){
         if(inDegree[i]==0){
             queue.offer(i);
         }
     }
     //记录拓扑排序
     if(cnt!=n){
         //图中存在环,拓扑排序不存在
         return new int[]{};
     }else{
         return order;
     }
 }
 

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

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

相关文章

华脉智联融合通讯基础引擎平台V2.0发布

华脉智联始于2012年&#xff0c;成立于2017年。历经11年在融合通讯、指挥调度领域的持续研发&#xff0c;于2024年发布华脉智联融合通讯基础引擎平台V2.0。 系统组成 1 核心平台 2 WEB调度台 3 PC调度台 4 云集群APP 5 云执法APP 系统特点 1 多网融合 可以支持多种网络接入和融…

【电商项目实战】购物车完善

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《电商项目实战》。&#x1f3af;&#x1f3af; &am…

windows11此应用无法在你的电脑上运行怎么解决

在使用电脑运行软件的时候&#xff0c;系统弹出了“此应用无法在你的电脑上运行”提示&#xff0c;导致没办法正常使用该软件&#xff0c;不知道怎么回事&#xff0c;针对这一问题&#xff0c; 方法一&#xff1a; 1、如果是win11里的软件&#xff0c;可以右键该软件&#xff0…

电子电器架构(E/E)演化 —— 车载以太网

电子电器架构&#xff08;E/E&#xff09;演化 —— 车载以太网 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 本文13000字。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一…

2024年01月IDE流行度最新排名

点击查看最新IDE流行度最新排名&#xff08;每月更新&#xff09; 2024年01月IDE流行度最新排名 顶级IDE排名是通过分析在谷歌上搜索IDE下载页面的频率而创建的 一个IDE被搜索的次数越多&#xff0c;这个IDE就被认为越受欢迎。原始数据来自谷歌Trends 如果您相信集体智慧&am…

Linux——进程初识(二)

1. 对当前目录创建文件的理解 我们知道在创建一个文件时&#xff0c;它会被默认创建到当前目录下&#xff0c;那么它是如何知道当前目录的呢&#xff1f; 对于下面这样一段代码 #include <stdio.h> #include <unistd.h>int main() {fopen("tmp.txt", …

polar CTF WEB-veryphp

1、题目 <?php error_reporting(0); highlight_file(__FILE__); include("config.php"); class qwq {function __wakeup(){die("Access Denied!");}static function oao(){show_source("config.php");} } $str file_get_contents("ph…

图神经网络——图学习

图学习 0. 前言1. 图2. 图学习3. 图神经网络小结 0. 前言 近年来&#xff0c;从社交网络到分子生物学等各个领域&#xff0c;数据的图表示越来越普遍。图神经网络 (Graph Neural Network, GNN) 是专为处理图结构数据而设计的&#xff0c;要充分挖掘图表示的潜力&#xff0c;深…

[Ray Tracing: The Rest of Your Life] 笔记

前言 开年第一篇博客~ 整理了三四个小时才整理完orz。 这一部分是光线追踪三部曲的最后一部&#xff0c;主要介绍了蒙特卡洛积分、重要性采样等内容。场景上没有什么大的改变&#xff0c;基本上就是在Cornell Box中渲染的&#xff0c;本篇主要在加速收敛&#xff0c;提升渲染效…

浅析PostgreSQL与SQL Server两者间的关键性差异

市场上有各种各样的数据库可供选择&#xff0c;用户通常可以仔细考虑PostgreSQL与SQL Server&#xff0c;以便为他们的用例找出更好的选择。使用PostgreSQL进行运营的组织可能希望切换到像Microsoft SQL Server这样的数据库&#xff0c;因为它主要迎合不同的数据仓库解决方案、…

学Python到底能干什么?看这里就知道

学Python到底能干什么&#xff1f;看这里就知道 | Python是一种代表简单主义思想的语言&#xff0c;极其容易上手&#xff0c;并且功能非常强大&#xff0c;这也是我的第二计算机语言。 个人可以使用Python去做哪些事呢&#xff1f; ✅办公自动化场景&#xff1a; 每天要处理…

磁盘管理-------磁盘分区

目录 引导语&#xff1a; 一、磁盘分区概念及作用 二、磁盘分区 &#xff08;一&#xff09;添加磁盘 &#xff08;二&#xff09;创建分区 &#xff08;三&#xff09;创建文件系统 &#xff08;四&#xff09;挂载 &#xff08;五&#xff09;永久挂载 三、扩展分区…

ROS学习笔记(7)进一步深入了解ROS第一步

0.前提 最近在学习宾夕法尼亚大学工程学院的ROS公开课&#xff0c;在尽力的去融入全英语的环境&#xff08;哪怕我的英语水准并不是很高&#xff09;。既然是在学习&#xff0c;笔记也就是必须的了&#xff0c;当然这些笔记都是课程当中提出的问题&#xff0c;我去寻找后得出的…

Neuro Contamination - Cyberpunk Gaming Music Futuristic Glitchy Sci-fi

无论是展示赛博朋克未来的电影场景&#xff0c;还是介绍高科技武器&#xff0c;你的音乐选择都至关重要。这首曲子的灵感来自科幻小说&#xff0c;旨在让你的观众想象未来的感觉。 潜在用例&#xff1a;科幻游戏、赛博朋克游戏、电影预告片、动作场景和产品广告。 非常适合充…

一呼百应API实时获取商品详情的实现

一、引言 随着电子商务的飞速发展&#xff0c;快速准确地获取商品详情变得尤为重要。一呼百应作为一家知名的B2B采购平台&#xff0c;提供了丰富的商品信息和交易数据。通过一呼百应的API接口&#xff0c;开发者可以实时获取商品详情&#xff0c;为业务决策和数据分析提供有力…

8868体育助力意甲国际米兰俱乐部 发掘强力新援

意甲的国际米兰俱乐部是8868体育的合作球队之一&#xff0c;国际米兰俱乐部本赛季在意甲联赛中的表现非常出色。他们以不败的成绩排名联赛榜首&#xff0c;展现出了强大的实力和稳定性。最近&#xff0c;有报道称&#xff0c;国米已经与泽林斯基完全达成协议&#xff0c;双方已…

Linux实战:部署基于Postfix 与 Dovecot 的邮件系统

一、电子邮件系统简介 在电子邮件系统中&#xff0c;为用户收发邮件的服务器名为邮件用户代理&#xff08;Mail User Agent&#xff0c;MUA&#xff09;&#xff0c;MTA &#xff08;邮件传输代理&#xff09;的工作职责是转发处理不同电子邮件服务供应商之间的邮件&#xff0…

计算机科学专业选网络安全方向咋样?

结论&#xff1a;慎重选择 原因&#xff1a;不妨看看学校相关方向的培养方案 如果学校真的是想让你成为一流网安人才的话 过来人告诉你&#xff1a; 计科的课你得上 不是计科的课你也得上(一般是数学课&#xff0c;比如密码学&#xff0c;数论) 还得在计算机系统基础实验…

摆烂式学习ssh

摆烂式学习ssh ssh工作原理ssh基本使用sshd配置文件密钥登录1.客户端2.服务器3.注意事项4.使用密钥登录测试 ssh高级使用技巧1.在非正规端口启动2.rsync 命令3.透过 ssh 通道加密原本无加密的服务4.以ssh信道配合x server 传递图形接口5.ssh配合virtualbox虚拟机使用技巧 ssh工…