拓扑排序(Kahn算法和基于DFS求解法)
拓扑排序是对有向无环图(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求解法)相关推荐
- 拓扑排序【Kahn算法(bfs)和dfs求拓扑序列及判环】
拓扑排序 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,该排序满足这样的条件--对于图中的任意两个结点u和v,若存在一条有 ...
- 拓扑排序----Kahn算法和字典序最小的拓扑排序
一.拓扑排序定义: 二.卡恩算法(Kahn): 1.Kahn算法介绍: 有向无环图DAG至少具有一个度数为0的顶点和一个度数为0的顶点. 证明:上述事实有一个简单的证明,即DAG不包含循环,这意味着所 ...
- (数据结构)有向图的拓扑排序 Kahn算法
拓扑排序是对有向无圈图的顶点的一种排序,使得如果存在一条从vi到vj的路径,那么在排序中,vi必须出现在vj的前面. 首先,我们需要准备一个vector<int> link[maxn],l ...
- DAG拓扑排序-Kahn算法
拓扑排序就是对一个有向无环图进行排序,使其变成一个线性关系,并且保证其前后的位置关系不改,简言之,就是把一个偏序变成一个全序(线性序). 拓扑排序有两种算法,一种是借助DFS排序,另一种是卡恩算法,这 ...
- 拓扑排序-Kahn算法
题目描述 众所周知, TT 是一位重度爱猫人士,他有一只神奇的魔法猫. 有一天,TT 在 B 站上观看猫猫的比赛.一共有 N 只猫猫,编号依次为1,2,3,-,N进行比赛.比赛结束后,Up 主会为所有 ...
- 拓扑排序——Kahn算法
Kahn算法 #include <iostream> #include<vector> #include<list> using namespace std;// ...
- 拓扑排序Kahn算法
拓扑排序 介绍 思路 操作过程 完美图解 代码模板 介绍 拓扑排序,整体是给出n个事件先后关系,来确定n个事件最终的先后关系 思路 很好理解 操作过程 我们可以理解成一个有向图如果x事件在y事件的前面 ...
- Poj 1094 拓扑排序Kahn
Poj 1094 拓扑排序Kahn Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4133 ...
- 通过深度优先算法进行拓扑排序(算法导论)
通过深度优先算法进行拓扑排序(Java) package graph; //拓扑排序用深度优先算法实现 import java.io.IOException; import java.util.Sca ...
最新文章
- 用计算机算出手机号码,手机计算器开根号怎么按(万能科学计算器在线使用方法)...
- 使用 Firefox攻击Web2.0应用(二)
- python【Numpy科学计算库】连女朋友都会用的Numpy(真の能看懂~!)
- Vulnhub靶机渗透之 RAVEN: 1
- Jenkins X:基于Kubernetes的CI/CD平台
- (6)nginx:rewrite
- 在阿里云 ECS 上配置 SSH
- 第二十七期:德国工业4.0眼里“工业互联网”与“智能制造”
- H.264 中的相关问题
- 怎样利用VNC远程连接LINUX桌面
- Nginx学习之十三-负载均衡-IP哈希策略剖析
- java 阻塞 直到完成_完成所有提交的任务后关闭Java执行程序而不会阻塞
- servlet mysql insert_servlet+mybatis 实现mysql的增删改查实例
- mysql解决编码问题
- Lenovo Quick Fix 联想智能解决工具
- CC2540 CC2541蓝牙芯片 蓝牙模块将升级至蓝牙5.0
- 常用照片尺寸和纸张尺寸参考
- 12 个最佳的免费学习编程的游戏网站
- ​鼠去仓实谷稻熟,牛来福地歌丰年
- python计算银行余额_Python 小案例实战 —— 简易银行存取款查询系统
热门文章
- 德标Y型过滤器特质及安装
- 人脸生成 Look across Elapse: Disentangled Representation Learning and Photorealistic Cross-Age Face
- C语言 链表输入输出数组
- Troubleshooting BGP 免积分下载
- 【Bootstrap导入模板完成实例-与模板完美契合】
- Alios-Thins教程连载 ④ 图文并茂教你使用乐鑫esp8266轻松连接阿里飞燕平台,个人设备实现轻松对接天猫精灵 。(下篇)(附带demo)
- Canvas绘制动画
- 【转】挖洞实战之信息泄露与前端加密
- CorelDraw插件开发-X4-反调试分析-CDR插件开发
- 阿里云发布城市大脑白皮书,公布三大衡量标准