拓扑排序就是对一个有向无环图进行排序,使其变成一个线性关系,并且保证其前后的位置关系不改,简言之,就是把一个偏序变成一个全序(线性序)。

拓扑排序有两种算法,一种是借助DFS排序,另一种是卡恩算法,这里采用的是卡恩算法。

算法思想很简单就是,就是不断删除入度为零的节点,因为入度为零就说明该节点没有前去节点,所以可以加如我们最后所要求的序列中,而那些有前驱的节点,就要受限制,就不能加入我们的最后序列中。

所以算法的伪代码可以是这样:

存储图关系 a->b; //数组 二维向量都可以存储
in[b]++; //b的入度+1for(int i = 0;i<n;i++){//扫描所有节点的入度if(in[i] == 0) q.push(i);//把入度为零的节点加入队列中
}while(!q.empty()){int num = q.front();//取出队首元素ans.push_back(num);//加入最后答案中q.pop();for(int i = 0;i<v[i].size();i++){//所有被该节点指向的节点的入度-1if(--in[v[num][i]] == 0) q.push(v[num][i]);//如果某节点入度为零,该节点应该加入队列中}
}输出最后答案;

需要注意的是:
1.构建图关系的时候,可能是正向建图,也可以是逆向建图,比如可以存储a > b ,也可以存储b < a,如果正向见图很复杂,可以考虑逆向见图。
2.存储图关系时最好采用二维vector,因为采用数组的话需要判断是否重复。
3.入度为零的点出队时候存在一个出队顺序问题,视具体情况而定,可以采用优先队列来控制出队顺序。

拓扑排序代码差不多可以这么写:

        vector <int > v;vector <int > a[MAX];queue <int > q;int n,m,x,y;cin >> n >> m;if(!n) break;int inn[n+10];memset(inn,0,sizeof(inn));for(int  i = 0;i<m;i++){cin >> x >> y;a[x].push_back(y);inn[y]++;}for(int i = 0;i<n;i++)if(!inn[i]){//入度为0的节点加入到队列中去q.push(i);}while(!q.empty()){int front = q.front();q.pop();v.push_back(front);for(int i = 0;i<(int)a[front].size();i++){if(--inn[a[front][i]] == 0)q.push(a[front][i]);}}

最后是几道例题:
HDU 3342
HDU 1285
POJ 3687(加粗是有原因的)

DAG拓扑排序-Kahn算法相关推荐

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

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

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

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

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

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

  4. 拓扑排序-Kahn算法

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

  5. 拓扑排序——Kahn算法

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

  6. 拓扑排序Kahn算法

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

  7. Poj 1094 拓扑排序Kahn

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

  8. 有向无环图DAG 拓扑排序 代码解释

    目录: DAG定义 举例描述 实际运用 算法描述 算法实战 算法可视化 定义 在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序(英语:Topological ...

  9. C#实现有向无环图(DAG)拓扑排序

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

最新文章

  1. 登录界面的滑动_电脑同时登录两个微信,原来这么简单?3步搞定!
  2. hdu5040 不错的广搜旋转的摄像头
  3. count 数字计数
  4. cookie 原理及应用
  5. Linux 进程控制相关函数
  6. python读写磁盘扇区数据_[Win32] 直接读写磁盘扇区(磁盘绝对读写)
  7. Java基础通信_Java网络通信基础编程(必看篇)
  8. python list()和[]的区别
  9. 杨柳目-杨柳科-柳属-柳树:柳树
  10. 如何理解封装,继承,多态?
  11. 【论文阅读】GPT系列论文详解
  12. A+B的各种写法(不是couta+b;)
  13. Linux 卷组逻辑卷创建管理和find高级使用 Set UID附加权限(DAY7)
  14. SwitchyOmega代理插件的安装与使用教程
  15. create和qypt qt_pyqt 与 qt c++ 开发windows客户端程序区别
  16. 工科赛树莓派OpenCV寻迹小车
  17. Git零基础教程①:如何加速开源社区github的打开(2022版)
  18. 二年级机器人伙伴看图写话_机器人的看图写话范文-看图写话机器人老师?
  19. 为什么说php是个玩具,买玩具的目的是什么
  20. 陈浩洋参访中馥科技集团仓储中心,直播单小时破百万

热门文章

  1. 打印PPT铺满A4纸
  2. 西门子S120运动控制西门SimotionStarte r运 动控制实例 西门子工业自动化运动控制行业一站式集齐
  3. 关于Donews的记忆---人生一世
  4. 软实力-领导力|影响力
  5. 深度学习图像数据增强data augmentation
  6. java计算机毕业设计vue图书档案管理系统MyBatis+系统+LW文档+源码+调试部署
  7. Scanner 扫描器
  8. 校园招聘渐入高峰,希望大家通过我的书可以找到合适的工作。
  9. 算法 {多路归并,二路归并,第K大数}
  10. 山东理工大学常用app及网址一览