基于入度的拓扑排序(Kahn's Algorithm)
本文中的图用邻接链表来表示
拓扑排序只针对于有向无环图(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; }
基于入度的拓扑排序(Kahn's Algorithm)相关推荐
- Poj 1094 拓扑排序Kahn
Poj 1094 拓扑排序Kahn Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4133 ...
- 算法导论:dfs深度优先搜索算法及基于dfs的拓扑排序以及宽度优先搜索算法bfs
1.dfs深度优先搜索算法 算法导论中是通过三种标记颜色来介绍dfs的,white代表还没被搜过,grey代表被搜了一些,还没结束,white表示已经搜索完成的状态. c/c++复现dfs代码 #in ...
- 拓扑排序(Kahn算法和基于DFS求解法)
拓扑排序是对有向无环图(DAG)进行排序,从而找到一个序列.该序列满足对于任意一对不同的顶点u,v∈V,若G中存在一条从u->v的边,则在此序列中u在v前面. 拓扑排序也可以用来判断一个有向图是 ...
- 拓扑排序----Kahn算法和字典序最小的拓扑排序
一.拓扑排序定义: 二.卡恩算法(Kahn): 1.Kahn算法介绍: 有向无环图DAG至少具有一个度数为0的顶点和一个度数为0的顶点. 证明:上述事实有一个简单的证明,即DAG不包含循环,这意味着所 ...
- (数据结构)有向图的拓扑排序 Kahn算法
拓扑排序是对有向无圈图的顶点的一种排序,使得如果存在一条从vi到vj的路径,那么在排序中,vi必须出现在vj的前面. 首先,我们需要准备一个vector<int> link[maxn],l ...
- DAG拓扑排序-Kahn算法
拓扑排序就是对一个有向无环图进行排序,使其变成一个线性关系,并且保证其前后的位置关系不改,简言之,就是把一个偏序变成一个全序(线性序). 拓扑排序有两种算法,一种是借助DFS排序,另一种是卡恩算法,这 ...
- 拓扑排序Kahn算法
拓扑排序 介绍 思路 操作过程 完美图解 代码模板 介绍 拓扑排序,整体是给出n个事件先后关系,来确定n个事件最终的先后关系 思路 很好理解 操作过程 我们可以理解成一个有向图如果x事件在y事件的前面 ...
- 拓扑排序-Kahn算法
题目描述 众所周知, TT 是一位重度爱猫人士,他有一只神奇的魔法猫. 有一天,TT 在 B 站上观看猫猫的比赛.一共有 N 只猫猫,编号依次为1,2,3,-,N进行比赛.比赛结束后,Up 主会为所有 ...
- 拓扑排序——Kahn算法
Kahn算法 #include <iostream> #include<vector> #include<list> using namespace std;// ...
最新文章
- pyHook 转码问题-MouseSwitch() missing 8 required positional arguments...,原因及解决办法
- 推荐算法炼丹笔记:如何让你的推荐系统具有可解释性?
- Qt Creator将应用程序部署到通用远程Linux设备
- Python面向对象(一)
- C语言面试题分享(2)
- (z) 什么是好的硬件工程师
- .net runtime占用cpu_.net 中的StringBuilder和TextWriter区别
- Java技术中的三大特性
- 10亿美元:MIT宣布建立计算学院,近70年来最大结构变革只为AI
- 用openssh下的sftp通过chroot控制用户
- JVM01----JVM结构
- 这个技巧,让你更从容地使用Mac电脑~
- syslinux 的EFI启动以及中文菜单
- java 中如何检测异常_如何检测Java中何时全局抛出了异常?
- P4167 [Violet]樱花
- 计算机第二课堂教学计划,第二课堂教学计划
- 打码兼职练习程序下载及说明
- php操作主从mysql_PHP 操作MySQL数据库
- Matlab语句:rmoutliers(检测并删除数据中的离群值)
- python 前端框架比较_浅谈五大Python Web框架