拓扑排序能否成功,其实就是看有没有环

  • 有环:说明环内结点互为前置,永远也不可能完成
  • 无环:是线性的,可以完成

DFS方法

思路:

逆向思维,遍历到边界点(无邻接点相当于叶子),再不断回溯将结点加入到结果中,得到的是拓扑排序的逆序,进行反转即可得到拓扑序列。

遍历过程中判断是否有环。

注意:要使用vist[]标记三种状态。假如只标记两种状态,则下面这种情况会判定为false,但其实是true

代码

  1. class Solution {
  2. // 找到出度为0的点,
  3. vector<int> res;
  4. vector<int> g[2005];
  5. int vist[2005]; // 1:正在遍历中 0:未遍历 2:已经完成了遍历
  6. bool isLegal = true;
  7. public:
  8. void dfs(int x){
  9. vist[x] = 1;
  10. for(int i = 0;i < g[x].size();i++){
  11. int nex = g[x][i];
  12. if(vist[nex] == 0){
  13. if(!isLegal) return ;
  14. dfs(nex);
  15. }else if(vist[nex] == 1){
  16. isLegal = false;
  17. return;
  18. }
  19. }
  20. vist[x] = 2;
  21. res.push_back(x);
  22. }
  23. vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
  24. int n = prerequisites.size();
  25. for(int i = 0;i < n;i++){
  26. int a = prerequisites[i][0], b = prerequisites[i][1];
  27. g[b].push_back(a);
  28. }
  29. for(int i = 0;i < numCourses;i++){
  30. if(!vist[i]) dfs(i);
  31. }
  32. if(!isLegal) return {};
  33. reverse(res.begin(),res.end());
  34. return res;
  35. }
  36. };

BFS方法

思路

正向,从入度为0的点开始正向遍历,使用每将一个点加入结果(删去),该点的邻接点的入度-1。若邻接点的入度减为0,则可以加入队列。最后结果集的数量应当等于课程的数量。

代码

  1. /*
  2. 拓扑排序(BFS)
  3. */
  4. #include <bits/stdc++.h>
  5. using namespace std;
  6. class Solution {
  7. // 构建图,并初始化每个结点的入度
  8. // 利用队列进行拓扑排序,不断的删除点,更新入度
  9. vector<int> res;
  10. int inDegree[2005];
  11. vector<int> g[2005];
  12. public:
  13. vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
  14. int n = prerequisites.size();
  15. for(int i = 0;i < n;i++){
  16. int a = prerequisites[i][0], b = prerequisites[i][1];
  17. g[b].push_back(a);
  18. inDegree[a]++;
  19. }
  20. queue<int> q;
  21. // 寻找源点
  22. for(int i = 0;i < numCourses;i++){
  23. if(inDegree[i] == 0){
  24. q.push(i);
  25. }
  26. }
  27. while(!q.empty()){
  28. int now = q.front();
  29. q.pop();
  30. res.push_back(now);
  31. for(int i = 0;i < g[now].size();i++){
  32. inDegree[g[now][i]]--;
  33. if(inDegree[g[now][i]] == 0){
  34. q.push(g[now][i]);
  35. }
  36. }
  37. }
  38. if(res.size() != numCourses) return {};
  39. return res;
  40. }
  41. };

leetcode210.拓扑排序的更多相关文章

  1. 算法与数据结构(七) AOV网的拓扑排序

    今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...

  2. 有向无环图的应用—AOV网 和 拓扑排序

    有向无环图:无环的有向图,简称 DAG (Directed Acycline Graph) 图. 一个有向图的生成树是一个有向树,一个非连通有向图的若干强连通分量生成若干有向树,这些有向数形成生成森林 ...

  3. 【BZOJ-2938】病毒 Trie图 + 拓扑排序

    2938: [Poi2000]病毒 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 609  Solved: 318[Submit][Status][Di ...

  4. BZOJ1565 [NOI2009]植物大战僵尸(拓扑排序 + 最大权闭合子图)

    题目 Source http://www.lydsy.com/JudgeOnline/problem.php?id=1565 Description Input Output 仅包含一个整数,表示可以 ...

  5. 图——拓扑排序(uva10305)

    John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task i ...

  6. Java排序算法——拓扑排序

    package graph; import java.util.LinkedList; import java.util.Queue; import thinkinjava.net.mindview. ...

  7. poj 3687(拓扑排序)

    http://poj.org/problem?id=3687 题意:有一些球他们都有各自的重量,而且每个球的重量都不相同,现在,要给这些球贴标签.如果这些球没有限定条件说是哪个比哪个轻的话,那么默认的 ...

  8. 拓扑排序 - 并查集 - Rank of Tetris

    Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球 ...

  9. *HDU1285 拓扑排序

    确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

随机推荐

  1. SpringBoot自定义classloader加密保护class文件

    背景 最近针对公司框架进行关键业务代码进行加密处理,防止通过jd-gui等反编译工具能够轻松还原工程代码,相关混淆方案配置使用比较复杂且针对springboot项目问题较多,所以针对class文件加密 ...

  2. ESXI系统从0搭建流程

    ESXI系统从0搭建流程 简单介绍 简单介绍:项目中使用到了这个系统,我自己不会搭建,但是请教别人之后自己成功搭建出来了此系统.所以在此记录一下搭建流程,希望能够帮助"零"小白. ...

  3. 关于Linux操作系统的命令行文件拷贝

    关于Linux操作系统的命令行文件拷贝 起因:服务器的加密狗秘钥过期导致无法使用服务,需要将服务器里面的秘钥文件发送给授权人员.本以为十分容易,打开服务器,图形界面点击发送即可.没想到服务器的界面是命 ...

  4. 入门pwn的练习

    都是比较简单的一些pwn的题目,也是团队里面的一个人发着做的,因为是初学,所以就还是先从简单的向难得方向去发展. 第一个 先用checksec或者die检测一下, 然后拖入到IDA,shift+f12 ...

  5. kali linux中ifconfig命令不能使用的解决办法

    1.安装net-tools,因ifconfig属于net-tools,输入命令:   sudo apt-get install net-tools 记住加上sudo哦!4647c21ef50df33a ...

  6. 【vs2019 】调试技巧

    在这篇文章中,我们假定读者了解VS基本的调试知识,如: F5 开始使用调试器运行程序 F9 在当前行设置断点 F10 运行到下一个断点处 F5 从被调试的已停止程序恢复执行 F11 步进到函数内(如果 ...

  7. mybatis plus框架的@TableField注解不生效问题总结

    一.问题描述 最近遇到一个mybatis plus的问题,@TableField注解不生效,导致查出来的字段反序列化后为空 数据库表结构: CREATE TABLE `client_role` ( ` ...

  8. MATLAB神经网络应用设计【1】

    基于看到一个博客的大佬说自己学的东西太多了,很容易遗忘.我觉得我目前也出现这样的问题了,所以在这里开了博客,开始记录整理自己的学习之旅.   今天看了这本书的前几章,看这个书的目的是为了1个多月后的数 ...

  9. layui 数据表格的使用(分页+总条数)

    下载地址 https://www.layui.com/ 点击实例,找到layui适合模板 2. 新建html将代码复制到对应模板,修改对应样式路径. 5.修改对应参数(url,field) 追加以下参 ...

  10. mysql更改my.ini配置文件以后mysql服务无法启动

    最近在调试mysql时,更改了mysql的端口以后发现,mysql怎么改都启动不了,从其它机器重新复制一个my.ini文件就可以启动,这是由于一般用记事本打开配置文件同时更改的ini的格式,我们需要重 ...