拓扑排序

1.什么是拓扑排序
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图
中任 意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序
(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操
作称之为拓扑排序。 无向图和有环的有向图没有拓扑排序拓扑排序其实就是离散上的偏序关系的一个应用
2、拓扑排序的步骤:
1.按照一定的顺序进行构造有向图,记录后个节点的入度; 2,从图中选择一个入度为0的顶点,输出该顶点; 3,从图中
删除该顶点及所有与该顶点相连的边 4,重复上述两步,直至所有顶点输出。 5或者当前图中不存在入度为0的顶点为
止。此时可说明图中有环。 6,因此,也可以通过拓扑排序来判断一个图是否有环。

举个栗子

然后我们可以按照上面的操作得到如下的几套方案 0>1>2>3>4>5>6 1>0>2>3>5>4>6 0>1>3>5>2>4>4 等等一系列方案

4、拓扑排序模板

#include <iostream>
#include <vector>
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
int in[10010];
vector<int> v[10010];
int main()
{int n,m;while(~scanf("%d %d",&n,&m)&&n&&m){memset(in,0,sizeof in);//清空入度for(int i=0;i<=n;i++) v[i].clear();for(int i=0;i<m;i++){int x,y;cin >>x>>y;//比如x赢了y  或者y是x的儿子 ;那么就让x指向y;v[x].push_back(y);in[y]++;//y的入度加1}priority_queue<int,vector<int>,greater<int> >q;//优先队列,设置从小到大排序,小的在队列下面for(int i=0;i<n;i++){if(in[i]==0)q.push(i);//把入度为0的节点压入队列}while(!q.empty()){int xx=q.top();q.pop();n--;//每次去掉一个节点for(int i=0;i<v[xx].size();i++){int yy=v[xx][i];in[yy]--;if(!in[yy])q.push(yy);//如果去掉上一个节点之后下一个节点的入度变为0,则压入队列中}}if(n) cout <<"NO"<<endl;//如果有环的话节点数不会为0else cout <<"YES"<<endl;}return 0;
}

拓扑排序详解(超详细+模板)相关推荐

  1. 八大排序详解-超详细

    目录 概述 一,选择排序-直接插入排序(Direct insertion sort) 二,插入排序-希尔排序(Shell sort) 三,选择排序-简单选择排序(Simple selection so ...

  2. Java 泛型详解(超详细的java泛型方法解析)

    Java 泛型详解(超详细的java泛型方法解析) 1. 什么是泛型 泛型:是一种把明确类型的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型.也就是说在泛型使用过程中,操作的数据类型被指定为 ...

  3. 斜率优化详解(超详细, 有图有代码有注释)

    文章目录 斜率优化引入 从例题开始 斜率优化Part 1: 推为斜率式 斜率优化Part 2: 合法点集的斜率单调性 Part 3: 找到最优决策点 Part 4: 斜率优化大流程 Part 5: 斜 ...

  4. 拓扑排序 详解 + 并查集 详解 + 最小生成树详解

    若您发现本文有什么错误,请联系我,我会及时改正的,谢谢您的合作! 本文为原创文章,转载请注明出处 本文链接   : http://www.cnblogs.com/Yan-C/p/3943940.htm ...

  5. mysql 联表比对,MySQL联表查询详解/超详细mysql left join,right join,inner join用法分析比较...

    超详细mysql left join,right join,inner join用法分析 下面是例子分析 表A记录如下: aID aNum 1 a20050111 2 a20050112 3 a200 ...

  6. log4j 配置详解(超详细)

    一.Log4j简介 Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使 ...

  7. 【bind()函数】JavaScript手写bind()及详解-超详细~~~

    这两天学习了手写call.apply.bind,手写bind思考了很久才实现了MDN的示例的结果,所以记录下来~ 因为是第一篇文章,所以可能存在一些错误,希望各位大佬批评指正,不吝赐教. 也欢迎不懂的 ...

  8. 拓扑排序详解 Java 模版代码实现

    拓扑排序 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G), ...

  9. @Autowired注解详解——超详细易懂

    @Autowired详解 要搞明白@Autowired注解就是要了解它是什么?有什么作用?怎么用?为什么? 首先了解一下IOC操作Bean管理,bean管理是指(1)spring创建对象 (2)spr ...

最新文章

  1. matlab基本杆组-运动学仿真,MATLAB基本杆组-运动学仿真.pdf
  2. OpenCV——人脸检测
  3. linux下查看进程的线程数,linux查看进程的线程数
  4. h:commandButton
  5. error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead.
  6. (数字IC)低功耗设计入门(五)——RTL级低功耗设计(续)
  7. vlfeat python
  8. 你不知道流量宝的神操作就能免费增加20万网站PV浏览量
  9. linux mailx 发送多个附件,CentOS安装mailx用命令以SMTP方式发送带附件邮件可用SSL
  10. 华为HCNA技术配置小型公司网络
  11. unity lookat导致物体颠倒怎么解决_在Unity 2D中如何用一行代码实现LookAt的效果,以及向量归一化小总结...
  12. 谁发明了验证码?你出来 保证不打死你
  13. C语言进阶第15式:逻辑运算符分析
  14. android 齿轮动画,Android(Animation): 一直转个不停的齿轮
  15. 微软鼠标测试软件,微软Precision鼠标评测:Surface生产力工具最佳搭配
  16. java第二个案例:运动员和教练(巩固理解抽象类和接口、继承等知识点)
  17. 计算机组成与体系结构 LRU 算法与 MRU 算法对比
  18. auto install pkgs
  19. Krita像素画教程
  20. Jmeter测试结果导出指南

热门文章

  1. 名为区块链实际资金盘的Fomo3D还能活多久?
  2. NOIP 2013 提高组初赛 青蛙跳荷叶
  3. mysql 目录迁移 表找不到_MySQL 数据文件迁移找不到表
  4. 阿里无人超市 “微笑打折”成世界互联网大会热点
  5. mysql连接提示错误_服务器经常提示mysql连接错误,有木有解决方法?
  6. Kubernetes and Cloud Native Meetup (广州站)资料下载 1
  7. struts2使用AbstractInterceptor实现拦截器
  8. AbstractInterceptor和MethodFilterInterceptor的区别
  9. OKhttp Rejecting re-init on previously-failed class Failed resolution of: Lorg/conscrypt/Conscrypt
  10. 孩子说“妈妈,我好害怕,这位妈妈的做法刷爆朋友圈