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

拓扑排序也可以用来判断一个有向图是否存在环。

有两种算法可以求得该序列:

1.Kahn算法。

其实就是不断的寻找有向图中没有前驱(入度为0)的顶点,将之输出。然后从有向图中删除所有以此顶点为尾的弧。重复操作,直至图空,或者找不到没有前驱的顶点为止。

该算法还可以判断有向图是否存在环(存在环的有向图肯定没有拓扑序列),通过一个count记录找出的顶点个数,如果少于N则说明存在环使剩余的顶点的入度不为0。(degree数组记录每个点的入度数)

模板代码1:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 505;
struct node
{int v, next;
}edge[maxn*maxn];
int degree[maxn], head[maxn];
queue<int> q;
list<int> ans;
int n, m, no;
inline void init()
{no = 0;while(!q.empty()) q.pop();memset(degree, 0, sizeof degree);memset(head, -1, sizeof head);
}
inline void add(int u, int v)
{edge[no].v = v;edge[no].next = head[u];head[u] = no++;
}
int Kahn()
{int count = 0;while(!q.empty()){int tp = q.front(); q.pop();++count; ans.push_back(tp);    //加入链表中,加入数组或者vector或者queue都无所谓 int k = head[tp];while(k != -1){--degree[edge[k].v];if(!degree[edge[k].v]) q.push(edge[k].v);k = edge[k].next;}}if(count == n) return 1;return 0;
}
int main()
{int u, v;scanf("%d %d", &n, &m); init();for(int i = 1; i <= m; ++i){scanf("%d %d", &u, &v);add(u, v); ++degree[v];}for(int i = 1; i <= n; ++i){if(!degree[i]) q.push(i);}Kahn();list<int>::iterator it;for(it = ans.begin(); it != ans.end(); ++it){cout << *it << " ";}cout << endl;return 0;
}

2.基于DFS的求解方法。

算法导论对于该种方法讲述的比较详细,由于它用的单链表存边,下面我只贴一份自己的模板代码。

思想基于:DFS时候,遇到u->v边,通过在DFS函数快退出时将结点加入到List中实现v在序列的位置始终在u的前

面。反向序列即为所求的拓扑序列。(这篇博文有整理算法导论的拓扑排序部分)

模板代码2:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 505;
struct node
{int v, next;
}edge[maxn*maxn];
int head[maxn], vis[maxn];
list<int> ans;
int n, m, no;
inline void init()
{no = 0;memset(head, -1, sizeof head);memset(vis, 0, sizeof vis);
}
inline void add(int u, int v)
{edge[no].v = v;edge[no].next = head[u];head[u] = no++;
}
void DFS(int cur)
{vis[cur] = 1;int k = head[cur];while(k != -1){if(!vis[edge[k].v]) DFS(edge[k].v);k = edge[k].next;}ans.push_back(cur);
}
int main()
{int u, v;scanf("%d %d", &n, &m); init();for(int i = 1; i <= m; ++i){scanf("%d %d", &u, &v);add(u, v);}for(int i = 1; i <= n; ++i){if(!vis[i]) DFS(i);} list<int>::reverse_iterator it;for(it = ans.rbegin(); it != ans.rend(); ++it){cout << *it << " ";}cout << endl;return 0;
}

继续加油~

拓扑排序(Kahn算法和基于DFS求解法)相关推荐

  1. 拓扑排序【Kahn算法(bfs)和dfs求拓扑序列及判环】

    拓扑排序 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,该排序满足这样的条件--对于图中的任意两个结点u和v,若存在一条有 ...

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

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

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

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

  4. DAG拓扑排序-Kahn算法

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

  5. 拓扑排序-Kahn算法

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

  6. 拓扑排序——Kahn算法

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

  7. 拓扑排序Kahn算法

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

  8. Poj 1094 拓扑排序Kahn

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

  9. 通过深度优先算法进行拓扑排序(算法导论)

    通过深度优先算法进行拓扑排序(Java) package graph; //拓扑排序用深度优先算法实现 import java.io.IOException; import java.util.Sca ...

最新文章

  1. 用计算机算出手机号码,手机计算器开根号怎么按(万能科学计算器在线使用方法)...
  2. 使用 Firefox攻击Web2.0应用(二)
  3. python【Numpy科学计算库】连女朋友都会用的Numpy(真の能看懂~!)
  4. Vulnhub靶机渗透之 RAVEN: 1
  5. Jenkins X:基于Kubernetes的CI/CD平台
  6. (6)nginx:rewrite
  7. 在阿里云 ECS 上配置 SSH
  8. 第二十七期:德国工业4.0眼里“工业互联网”与“智能制造”
  9. H.264 中的相关问题
  10. 怎样利用VNC远程连接LINUX桌面
  11. Nginx学习之十三-负载均衡-IP哈希策略剖析
  12. java 阻塞 直到完成_完成所有提交的任务后关闭Java执行程序而不会阻塞
  13. servlet mysql insert_servlet+mybatis 实现mysql的增删改查实例
  14. mysql解决编码问题
  15. Lenovo Quick Fix 联想智能解决工具
  16. CC2540 CC2541蓝牙芯片 蓝牙模块将升级至蓝牙5.0
  17. 常用照片尺寸和纸张尺寸参考
  18. 12 个最佳的免费学习编程的游戏网站
  19. ​鼠去仓实谷稻熟,牛来福地歌丰年
  20. python计算银行余额_Python 小案例实战 —— 简易银行存取款查询系统

热门文章

  1. 德标Y型过滤器特质及安装
  2. 人脸生成 Look across Elapse: Disentangled Representation Learning and Photorealistic Cross-Age Face
  3. C语言 链表输入输出数组
  4. Troubleshooting BGP 免积分下载
  5. 【Bootstrap导入模板完成实例-与模板完美契合】
  6. Alios-Thins教程连载 ④ 图文并茂教你使用乐鑫esp8266轻松连接阿里飞燕平台,个人设备实现轻松对接天猫精灵 。(下篇)(附带demo)
  7. Canvas绘制动画
  8. 【转】挖洞实战之信息泄露与前端加密
  9. CorelDraw插件开发-X4-反调试分析-CDR插件开发
  10. 阿里云发布城市大脑白皮书,公布三大衡量标准