拓扑排序:

对于有向无环图,访问当前顶点时必须 保证指向该顶点的所有顶点已经访问过

作用:

1.得到一个【拓扑序】(不唯一)

2.检测【有向图】是否有环:如果有拓扑排序则无环,否则有环

(如果存在环,则拓扑排序在某一步不能得到入度为0的节点,退出循环,此时图中存在没有遍历到的节点)

应用场景:任务调度计划,课程安排等

对于上图必须先访问a,才可以访问b或c,要访问d,b和c必须先访问过

所以,拓扑排序为a->b->c->d   或者a->c->b->d

方法:

1.找到一个入度为0的节点并访问

2.删除入度为0的节点以及从这个节点出去的所有边,继续执行1,直至图为NULL

算法讲解:(参考力扣题解)

拓扑排序的本质是:广度优先遍历贪心算法

拓扑排序是【广度优先遍历】和【贪心算法】应用于【有向图】的一个专有名词

【贪心算法】:每一步都从图中删除入度为0的点,得到的就是拓扑排序

具体算法:

1.开始排序前,将入度为0的节点放入队列

2.队列非空时循环,出队一个节点并访问,并将这个节点所有的指向的节点度数-1,如果度数-1后为0,则进队

拓扑排序的遍历和普通的图遍历

用到的BFS算法比较:

普通的BFS需要visited数组,进队一个节点出队后把没访问过的邻接点入队

拓扑遍历的BFS需要入度表indegrees.进队一个入度为0的节点入度-1后入度为0的邻接点入队

注意:BFS不需要设置visited数组,因为有向无环图保证了节点是单向的不能重复访问,否则有环

leetcode210 课程表||

题目链接:力扣

思路:拓扑排序(BFS,贪心)

设置一个入度数组,每一轮都输出入度为0的节点,移除后对它指向的节点的入度-1

依次得到的节点序列就是拓扑排序的节点序列

class Solution
{
public:vector<int>findOrder(int numCourses,vector<vector<int>>&prereqiosotes)
{
int n=numCourese;
vector<vector<int>>edges(n);
vector<int>indegree(n);
vector<int>ans;
//建立邻接表
for(auto p:prerequisites)
{edges[p[1]].push_back(p[0]);inderee[p[0]]++;
}
//入度为0,进入队列
queue<int>q;
for(int i=0;i<n;i++)
{
if(indegree[i]==0)
{q.push[i];
}
}
//使用BFS,元素出队,减少对应元素的入度数
while(!q.empty())
{
int b=q.front();
q.pop();
ans.push_back(b);
for(auto a:edges[b])
{if(--indegree[a]==0)
{q.push(a);
}
}
}
if(ans.size()==n)
{
return ans;
}
return {};
};

leetcode207 课程表

题目链接:力扣

思路同上

class Solution {public:bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {//邻接表vector<vector<int>>edges;//入度表vector<int>indegrees;int count = 0;edges.resize(numCourses);indegrees.resize(numCourses);for (const auto n : prerequisites){//初始化邻接表edges[n[1]].push_back(n[0]);//初始化入度表indegrees[n[0]]++;}queue<int>q;for (int i = 0; i < numCourses; i++){if (indegrees[i] == 0){q.push(i);}}while (!q.empty()){int p = q.front();q.pop();count++;for (int i = 0; i < edges[p].size(); i++){indegrees[edges[p][i]]--;if (indegrees[edges[p][i]] == 0){q.push(edges[p][i]);}}}return count == numCourses;}
};

【数据结构和算法】拓扑排序(附leetcode题 207/210 课程表)相关推荐

  1. C语言数据结构与算法---拓扑排序、关键路径

    文章目录 一. 有向无环图 二. 拓扑排序 1. 分析 2. 拓扑排序的定义及方法 3. 拓扑排序的重要应用 4. 拓扑排序的算法实现 三. 关键路径 1.分析 2. 什么是关键路径 3. 关键路径的 ...

  2. 数据结构与算法—拓扑排序

    目录 介绍 拓扑排序算法分析 拓扑排序代码实现 介绍 拓扑排序,很多人都可能听说但是不了解的一种算法.或许很多人只知道它是图论的一种排序,至于干什么的不清楚.又或许很多人可能还会认为它是一种啥排序.而 ...

  3. Python 数据结构与算法——拓扑排序

    几乎在所有的项目,甚至日常生活,待完成的不同任务之间通常都会存在着某些依赖关系,这些依赖关系会为它们的执行顺序行程表部分约束.对于这种依赖关系,很容易将其表示成一个有向无环图(Directed Acy ...

  4. 最全最详细数据结构与算法视频-【附课件和源码】

    源码和课件下载方式在文末 什么是数据结构与算法 算法用来设计并实现一种用计算机来解决问题的方法.它满足下列性质: 输入:有零个或多个输入量 输出:产生至少一个输出量 确定性:算法的指令清晰.无歧义 有 ...

  5. 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

  6. 在Object-C中学习数据结构与算法之排序算法

    笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...

  7. 数据结构排序算法实验报告_[数据结构与算法系列]排序算法(二)

    我的上一篇文章向大家介绍了排序算法中的冒泡排序.插入排序和选择排序.它们都是平均时间复杂度为 O(n^2) 的排序算法,同时还为大家讲解了什么是原地排序和什么是排序的稳定性.下图是这三种算法的比较,不 ...

  8. 数据结构与算法(三) 排序算法(代码示例)

    数据结构与算法三 排序算法 1. 选择排序 2. 插入排序 3. 冒泡排序 4. 归并排序 5. 快速排序 6. 希尔排序 7. 堆排序 总结 1. 选择排序 选择排序的基本原理: 对于未排序的一组记 ...

  9. 数据结构与算法之排序算法

    数据结构与算法之排序算法 排序算法的介绍 ​ 排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排序的过程. 排序的分类 1)内部排序:指将需要处理的数据都加载到内部 ...

最新文章

  1. idea java 非web程序打包
  2. 品牌才是硬道理——一线、二线主板品牌集中营品牌才是硬道理——一线、二线主板品牌集中营...
  3. 同步器 java_您可能不知道的五个高级Java同步器
  4. 弹出打开/保存文件对话框 选择文件夹对话框
  5. QTP提供的编程接口实现对QTP操作
  6. servu无法显示远程文件夹_win10软件:解决文件资源管理器无法显示文件夹大小...
  7. TikZ学习笔记(四)圆的进一步探索与复杂几何图形
  8. java实现小程序订阅消息推送(附源码)
  9. that being said
  10. Codeforces Round #554 (Div. 2) A. Neko Finds Grapes
  11. 行业内参:2019年支付监管框架将有大调整 线上线下牌照合并重划
  12. 传说Silverlight 3将提升4成浏览效能
  13. 链表逆置(三种方法详解)
  14. linux c python,Python 不是 C
  15. 《人月神话》第十一弹
  16. 字节跳动面试总结-3.18
  17. 红米路由器ac2100怎样设置ipv6_红米路由器AC2100怎么样
  18. list object has no attribute ZScan_书香家庭NO.31 | 成长路上飘书香
  19. 《银翼杀手》画面布局赏析
  20. Vue-change和input事件

热门文章

  1. GARFIELD@05-01-2005
  2. Bailian3252 最大正向匹配【字符串匹配】
  3. HDU2009 求数列的和【入门】
  4. 音译 —— 本身的含义
  5. 数学归纳法在数据结构与算法分析设计中的应用
  6. 恒星演化 —— 恒星的一生
  7. 趣学 C 语言(四)—— 字符串与字符数组
  8. Linux C/C++ —— intent 工具,time 命令
  9. 【学习 OpenCV】—— 图像减色(color reduced)
  10. C++ 标准库 —— random