本文中的图用邻接链表来表示

拓扑排序只针对于有向无环图(DAG)才能完成,所以可以利用拓扑排序来判断一个有向图是否有环。

某一点的入度:图中指向该顶点的边的个数

图1 :DAG

以上图简单说明,点0的入度即为2。下面介绍拓扑排序的算法流程:

Step 1:计算出所有顶点的入度。

Step2 :将所有入度为0的点加入到一个队列。

Step3 :将队头元素取出,然后pop()。

1.count变量表示访问过的顶点个数,将count加1.

2.用top数组将每一次出队的元素保存起来。

3.将这个点的所有相邻点的入度减一,如果某个相邻点的入度减小为0,则将这个相邻点加入到队列中。

Step4 :重复Step3直到队列为空

Step5 :如果count和顶点个数相同,则将top数组中的元素按序输出就是排序后的结果;如果count不等于顶点个数

(在不相等的情况下,一般是count大于顶点个数),说明图中存在环,拓扑排序无法完成。

入度的计算方法:

遍历所有的顶点,每一次遍历,将该点所有相邻的点的入度都加1。所有的点遍历完后,入度就计算完成了。

具体拓扑排序代码如下:


#include#include#include#includeusing namespace std;
class Graph{
private:
int V;
list*adj; public: Graph(int V){ this->V =V; adj = new list[V]; } //有向图 void addEdge(int src, int dest){ adj[src].push_back(dest); } void toplogicSortInd(){ vectorindegree(V,0); queueq; vectortop; //用来存储拓扑排序的结果 int count = 0; //记录访问过的顶点个数 //step1:计算入度 for(int v = 0; v < V; v++){ list::iterator itr; for(itr = adj[v].begin(); itr != adj[v].end(); itr++){ indegree[*itr]++; } } //step2:将入度为0的点入队 for(int u = 0; u < V; u++){ if(indegree[u] == 0) q.push(u); } //step3 && step4 while(!q.empty()){ int v = q.front(); top.push_back(v); q.pop(); count++; list::iterator itr; for(itr = adj[v].begin(); itr!=adj[v].end(); itr++){ if(--indegree[*itr] == 0) q.push(*itr); } } if(count != V){ cout << "\n图中存在环,拓扑排序无法完成。\n"; return; } else{ for(int i = 0; i < V; i++){ cout << top[i] << " "; } cout << endl; } } }; // Driver program to test above functions int main() { // Create a graph given in the above diagram Graph g(6); g.addEdge(5, 2); g.addEdge(5, 0); g.addEdge(4, 0); g.addEdge(4, 1); g.addEdge(2, 3); g.addEdge(3, 1); cout << "拓扑排序的一种结果是 \n"; g.toplogicSortInd(); return 0; } 
结果是:4 5 2 0 3 1

基于入度的拓扑排序(Kahn's Algorithm)相关推荐

  1. Poj 1094 拓扑排序Kahn

    Poj 1094 拓扑排序Kahn Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4133 ...

  2. 算法导论:dfs深度优先搜索算法及基于dfs的拓扑排序以及宽度优先搜索算法bfs

    1.dfs深度优先搜索算法 算法导论中是通过三种标记颜色来介绍dfs的,white代表还没被搜过,grey代表被搜了一些,还没结束,white表示已经搜索完成的状态. c/c++复现dfs代码 #in ...

  3. 拓扑排序(Kahn算法和基于DFS求解法)

    拓扑排序是对有向无环图(DAG)进行排序,从而找到一个序列.该序列满足对于任意一对不同的顶点u,v∈V,若G中存在一条从u->v的边,则在此序列中u在v前面. 拓扑排序也可以用来判断一个有向图是 ...

  4. 拓扑排序----Kahn算法和字典序最小的拓扑排序

    一.拓扑排序定义: 二.卡恩算法(Kahn): 1.Kahn算法介绍: 有向无环图DAG至少具有一个度数为0的顶点和一个度数为0的顶点. 证明:上述事实有一个简单的证明,即DAG不包含循环,这意味着所 ...

  5. (数据结构)有向图的拓扑排序 Kahn算法

    拓扑排序是对有向无圈图的顶点的一种排序,使得如果存在一条从vi到vj的路径,那么在排序中,vi必须出现在vj的前面. 首先,我们需要准备一个vector<int> link[maxn],l ...

  6. DAG拓扑排序-Kahn算法

    拓扑排序就是对一个有向无环图进行排序,使其变成一个线性关系,并且保证其前后的位置关系不改,简言之,就是把一个偏序变成一个全序(线性序). 拓扑排序有两种算法,一种是借助DFS排序,另一种是卡恩算法,这 ...

  7. 拓扑排序Kahn算法

    拓扑排序 介绍 思路 操作过程 完美图解 代码模板 介绍 拓扑排序,整体是给出n个事件先后关系,来确定n个事件最终的先后关系 思路 很好理解 操作过程 我们可以理解成一个有向图如果x事件在y事件的前面 ...

  8. 拓扑排序-Kahn算法

    题目描述 众所周知, TT 是一位重度爱猫人士,他有一只神奇的魔法猫. 有一天,TT 在 B 站上观看猫猫的比赛.一共有 N 只猫猫,编号依次为1,2,3,-,N进行比赛.比赛结束后,Up 主会为所有 ...

  9. 拓扑排序——Kahn算法

    Kahn算法 #include <iostream> #include<vector> #include<list> using namespace std;// ...

最新文章

  1. pyHook 转码问题-MouseSwitch() missing 8 required positional arguments...,原因及解决办法
  2. 推荐算法炼丹笔记:如何让你的推荐系统具有可解释性?
  3. Qt Creator将应用程序部署到通用远程Linux设备
  4. Python面向对象(一)
  5. C语言面试题分享(2)
  6. (z) 什么是好的硬件工程师
  7. .net runtime占用cpu_.net 中的StringBuilder和TextWriter区别
  8. Java技术中的三大特性
  9. 10亿美元:MIT宣布建立计算学院,近70年来最大结构变革只为AI
  10. 用openssh下的sftp通过chroot控制用户
  11. JVM01----JVM结构
  12. 这个技巧,让你更从容地使用Mac电脑~
  13. syslinux 的EFI启动以及中文菜单
  14. java 中如何检测异常_如何检测Java中何时全局抛出了异常?
  15. P4167 [Violet]樱花
  16. 计算机第二课堂教学计划,第二课堂教学计划
  17. 打码兼职练习程序下载及说明
  18. php操作主从mysql_PHP 操作MySQL数据库
  19. Matlab语句:rmoutliers(检测并删除数据中的离群值)
  20. python 前端框架比较_浅谈五大Python Web框架

热门文章

  1. 海尔张瑞敏 :人不成熟的五大特征
  2. 新浪微博客户端开发详解(三)
  3. 自学java核心技术笔记(康师傅)
  4. 社区使用人脸识别闸机有什么好处?
  5. IaaS:基础设施及服务
  6. informa医药数据库价格
  7. VUE对数组进行深度监听无法改变值解决办法(全网最详细)
  8. 各种各样的分布函数-卡方分布
  9. 深度分享:中国老年消费市场最新趋势/机会是什么?六位老年行业创新创业实践者精彩观点!
  10. 网站域名到期无法续费后还能买回来吗?