博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
拓扑排序
阅读量:4154 次
发布时间:2019-05-25

本文共 901 字,大约阅读时间需要 3 分钟。

书上讲得太抽象,下面博客写的很清晰明了

拓扑排序简单来说就是把一个图的所有节点排序,使得每一条有向边(u,v)对应的u都排在v的前面。 

拓扑排序最大的用途就是判断一个有向图是否有环,当然判断还有一种方法就是Floyd算法。

如果用邻接表的话拓扑排序的时间复杂度是O(N*E),邻接矩阵是O(N^2),N表示顶点数,E表示边数,Floyd时间复杂度是O(N^3)。

性质

1、 拓扑排序在有向无环图中才能排出有效的序列,否则能判断该有向图有环。
2、如果输入的有向图中的点,不存在入度为0的点,则该有向图存在回路
3、如果存在的入度为0的点大于一个,则该有向图肯定不存在一个可以确定的拓扑序列但并不妨碍拓扑排序 

下面给出核心程序:

vector
g[N];//邻接表存储int vis[N],topo[N],cnt;bool dfs(int u){ vis[u] = -1;//-1用来表示顶点u正在访问 for(int i = 0 ; i < g[u].size() ; i ++) { if(vis[g[u][i]] == -1)//表示这个点进入了两次,肯定出现了环 return false; else if(vis[g[u][i]] == 0) { dfs(g[u][i]); } } vis[u] = 1; topo[cnt++] = u;//放到结果数组里,输出的时候记得倒序输出,(回溯的原因) return true;}bool toposort(int n){ memset(vis,0,sizeof(vis)); for(int i = 1 ; i <= n ; i ++) { if(!vis[i]) { if(!dfs(i)) return false;//huan } } return true;}

还可以判断是否有环

转载地址:http://fseti.baihongyu.com/

你可能感兴趣的文章
数据库查询优化技术(一):数据库与关系代数
查看>>
数据库查询优化技术(二):子查询优化
查看>>
网站接入第三方登录功能:Java开发QQ登录
查看>>
MyEclipse的debug远程调试
查看>>
java中的日期转换、springmvc接收前台的Date类型参数遇到的坑
查看>>
Ajax使用formData提交带图片上传的表单
查看>>
Linux服务器安装Tomcat、MySQL和一些配置
查看>>
Java开发微信小程序登录接口
查看>>
myeclipse的优化与字体颜色格式的配置
查看>>
使用springmvc的拦截器应用
查看>>
Java通过Poi的开发Excel导入导出和下载功能
查看>>
MathJax的使用
查看>>
java中的一些经典算法
查看>>
Linxu下实现数据库每天自动备份
查看>>
Qrcode生成二维码相关问题
查看>>
vue项目环境搭建和运行
查看>>
浙江创邻科技两道笔试题-附答案
查看>>
WebService学习(1)——相关概念和简单示例
查看>>
面试:java笔试题(1)
查看>>
Linux防火墙
查看>>