前:

  1. 什么是拓扑排序——(完)
  2. 如何判断图是否满足拓扑排序(环的判断)——(完)
  3. 拓扑排序的作用——(完)
  4. 什么是AOV图——(完)
  5. 拓扑算法讲解(完)
  6. 拓扑排序算法实现(完)

什么是拓扑排序?

1、对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序
——————来自百度百科

简单的说:
①拓扑排序就是 一种排序。
②是一种 按照制约关系的排序, (制约的一定在被制约的前面)
③ 拓扑完后,原来的偏序,排列成线性序列。
/*******拓扑排序 的结果不是唯一的/
图片:
/用有向图表示制约关系/

拓扑后:(1 3 2 4)

如何判断图是否满足拓扑排序(环的判断)


对于图中的情况, 我们排好1, 但2 制约 3, 3制约 4 , 4 制约 2, 所以就无法进行拓扑排序。

拓扑排序是针对有向无环图, 而中有环路, 所以就不能拓扑排序。
判断图是否符合拓扑排序, 拓扑完 判断 拓扑好的节点个数 是否等于总结点个数就行。
等于表示能拓扑排序, 无环路。
否则有环路, 不能满足拓扑排序。

拓扑排序的作用?

现实生活中一个活动, 都要分好几个步骤完成, 有些步骤y, 必须在完成步骤x后才能进行
。所以我们需要拓扑排序, 来知道那一步要先做, 哪一步要后做。下面是一个例子:

(图片引自百度百科)

例如,假定一个计算机专业的学生必须完成图3-4所列出的全部课程。在这里,课程代表活动,学习一门课程就表示进行一项活动,学习每门课程的先决条件是学完它的全部先修课程。如学习《数据结构》课程就必须安排在学完它的两门先修课程《离散数学》和《算法语言》之后。学习《高等数学》课程则可以随时安排,因为它是基础课程,没有先修课。若用AOV网来表示这种课程安排的先后关系,则如图3-5所示。图中的每个顶点代表一门课程,每条有向边代表起点对应的课程是终点对应课程的先修课。从图中可以清楚地看出各课程之间的先修和后续的关系。如课程C5的先修课为C2,后续课程为C4和C6。

(图片引自百度百科)

AOV 网

AOV网, 全名(Activity On Vertex Network)。
看了全称, 想必你对AOV也了解的差不多了。
AOV 说白了, 就是用 节点(Vertex) 表示活动, 有向边( Directed Edge)表示制约关系的 有向无环图。

因为AOV网属于有向无环图,所以可以用来进行拓扑排序。

拓扑排序算法

#include<bits/stdc++.h>
#define Max 20
using namespace std;
int  n, m; // n表示 结点数
struct VNode// 表头
{int f;int in;// 入度struct ENode *first;}V[Max];struct ENode//表边
{int w;// 权值int to;// 终点struct ENode *next;// 下一个边
};typedef struct ENode *Enode;int TopologicalSort()// 拓扑排序
{stack<int> Stack;// 栈int cou = 0; // 用于统计 拓扑完的个数for(int i = 1;i <= n;i++)// 将入度为 0 的 压入 因为入度为零 表示没有制约条件{if(V[i].in == 0){Stack.push(i);}}while(!Stack.empty())//每次{int gettop = Stack.top();//选出入度为 0Stack.pop(); //出栈cou++;// 出栈的元素已经拓扑完ENode *e;for(e = V[gettop].first;e!= NULL;e = e->next)// 除去gettop这个制约条件{int to = e->to;if(!(--V[to].in))// 如果{Stack.push(to);}}}if(cou < n)// 如果 拓扑完的个数 少于结点数 就表示 有环路{return 0;}else return 1;}void Init(struct VNode  v[], int N)//初始化表头
{for(int i = 1;i <= N;i++){v[i].in = 0;v[i].first = NULL;}}void Create(int u, int v)
{Enode temp = new(ENode);temp->next = NULL;temp->to = v;Enode e = V[u].first;if(e == NULL){V[u].first = temp;}else{while(e->next!= NULL){e = e->next;}e->next = temp;}V[v].in++;}void Build( int M)
{for(int i = 0;i < M;i++){int u, v;scanf("%d %d", &u,  &v);Create(u, v);}
}int main(void)
{while(~scanf("%d %d", &n, &m)){Init( V, n);Build(m);int flag = TopologicalSort();if(flag == 1)printf("YES\n");else printf("NO\n");}return 0;
}/***************************************************
User name: rj180510陶军辉
Result: Accepted
Take time: 0ms
Take Memory: 192KB
Submit time: 2019-05-14 11:33:19
****************************************************/

算法讲解

拓扑排序。

①、首先将入度为0 的入栈。
②然后栈顶出栈, (表示该点拓扑完, cou++, cou 是统计拓扑完的节点数)

③ 将栈顶的出边去掉, 对应的终点入度 -1;
④判断入度 -1 后的节点是否变为入度0,如果为0 入栈。
⑤ 如果栈为空 结束,
否则重复②到④;

拓扑排序算法(1.0版)相关推荐

  1. 【zz】如何去理解 拓扑排序算法

    from http://www.cnblogs.com/shanyou/archive/2006/11/16/562861.html 查看Castle的代码,在Castle.Core中内部的数据结构采 ...

  2. vant coupon 时间戳如何计算_计软考研双日练 | 如何计算拓扑排序算法的时间复杂度?...

    ☝☝☝ 软件工程考研独家平台 撰稿 | 康康哥 编辑 | 丽丽姐 本文由懂计算机.软件工程的博士师哥原创 双日练:NO.20200610 若将n个顶点e条弧的有向图采用邻接表存储,则拓扑排序算法的时间 ...

  3. 经典排序算法(Java版)

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 经典排序 ...

  4. 经典的十种排序算法 C语言版

    经典的十种排序算法(C语言版) 1.冒牌排序 冒牌排序的特点 ​ 一趟一趟的比较待排序的数组,每趟比较中,从前往后,依次比较这个数和下一个数的大小,如果这个数比下一个数大,则交换这两个数,每趟比较后, ...

  5. 邻接表存储 - 拓扑排序算法

    拓扑排序:用下面的例子介绍------> ---------------------------------------------------------------------------- ...

  6. JavaScript实现topologicalSort拓扑排序算法(附完整源码)

    JavaScript实现topologicalSort拓扑排序算法(附完整源码) Comparator.js完整源代码 LinkedListNode.js完整源代码 LinkedList.js完整源代 ...

  7. C++实现topological sort拓扑排序算法(附完整源码)

    C++实现topological sort拓扑排序算法 C++实现topological sort拓扑排序算法完整源码(定义,实现,main函数测试) C++实现topological sort拓扑排 ...

  8. C++使用kahn实现topological sort拓扑排序算法(附完整源码)

    C++使用kahn实现topological sort拓扑排序算法 C++使用kahn实现topological sort拓扑排序算法完整源码(定义,实现,main函数测试) C++使用kahn实现t ...

  9. 如何理解拓扑排序算法(转)

    对于一条有向边(u,v),定义u < v:满足所有这样条件的结点序列称为拓扑序列.拓扑排序就是求一个有向图的拓扑序列的算法. 一个有向图顶点的拓扑序列不是惟一的.并不是任何有向图的顶点都可以排成 ...

  10. 有向图的拓扑排序算法JAVA实现

    一,问题描述 给定一个有向图G=(V,E),将之进行拓扑排序,如果图有环,则提示异常. 要想实现图的算法,如拓扑排序.最短路径--并运行看输出结果,首先就得构造一个图.由于构造图的方式有很多种,这里假 ...

最新文章

  1. 小型化RDA5807调频收音模块实验板
  2. 【安全漏洞】SRC另类思路分享:不受限制的资源调用
  3. 确实会玩!教你用Python玩转数据~
  4. 公用技术——设计模式5——创建型模式——建造者模式——待补充
  5. eclipse软件有时会退出弹出一串错误弹框_修复iPhone上的iOS 13软件更新失败错误...
  6. 有人问李嘉诚的儿子李泽楷:“你父亲都教了你哪些成功赚钱的秘诀?”
  7. 如何简单利用git_stats脚本统计项目的代码量(以及win平台使用时的错误排除)...
  8. 如何让语音芯片与功放芯片之间更好地配合让音效更好
  9. 软件测试案例|移动APP非功能性测试
  10. 平均值,标准差,方差,协方差,期望,均方误差
  11. gis地图图层(前台)
  12. 美团 P2P 图书馆实践:5天时间1845册图书共享入库
  13. qq邮件如何设置html阅读,使用qq邮箱发送html格式的邮件
  14. 【Android开发经验】Android移动UI设计经验总结
  15. 使用虚拟机VMwarepro1623镜像文件导入部署openGauss3.1.1指导手册
  16. .Net 根据年份计算周次和起止日期
  17. java号码分身_[算法] 电话号码分身 (小米2017 秋招真题)[JavaScript]
  18. android友盟错误日志,友盟崩溃日志分析三种方式
  19. telnet远程管理及AAA认证方式
  20. 【小技巧】强制重启无线网卡,解决“区域中找不到无线网络,请确定您计算机上的无线开关已启用”问题...

热门文章

  1. 【数码复印新生态】东芝泰格强势支持统信UOS
  2. 凭据分配没有加密oracle_两种方法解决远程桌面出现“这可能是由于CredSSP加密Oracle修正”的问题-网络教程与技术 -亦是美网络...
  3. 38. Python批量翻译英语单词
  4. asymptotic (infinite-training-sample)
  5. C++ typedef 用法详解
  6. c语言一维高斯滤波器,高斯滤波简介,高斯滤波性质及应用
  7. 关系数据库到Hbase数据库的数据迁移
  8. python ocr识别身份证_Python+opencv+pytesseract实现身份证号码识别
  9. 求基于图像处理的身份证号码识别的程序
  10. 使用第三方插件Curvy为unity场景快速生成运动轨迹与赛道