博主以前有一个疑问,DFS和BFS各自的适用范围是?我想你今天看了这篇文章之后会有一个判断!

BFS

数据结构与算法分析:c语言描述(p217)

已经存在一个Indgree入度数组(indgree[v]={(u,v)的数目})

以及一个邻接矩阵,求一个拓扑排序

提示:图中出现环就会拓扑失败

代码风格被我改为了C++

void TopSort(vector> G){

//图中所有的点都要被遍历到,每次取出一个点,共执行NumVertex次

for(int counter=0;counter

int v=findVertexIndgreeZero(G);//寻找入度为0的点

if(!v){

cout<

return;

}

TopNum[v]=counter;//第counter+1个被遍历到的

for(int i;i

if(G[v][i])

indgree[i]--;

}

}

}

用一句话来概括这个算法就是依次寻找出入度为0的点,然后将其所通的所有点入度都减1。循环直至结束或者报错(有环)。

上面这个算法存在优化的余地,findVertexIndgreeZero()的复杂度为O(n),执行n次为O(N2)次,用一个队列会大大缩减复杂度

void TopSort(vector> G){

int counter=0;

queue q;

for(int i=0;i

if(indgree[i]==0);

q.push(i);

}

while(!q.empty()){

int u=q.top();q.pop();

TopNum[u]=counter++;

for(int i=0;i

if(G[u][i]){

if(--indgree[i]==0)

q.push(i);

}

}

}

if(counter!=G.size())

cout<

}

这个结果很有趣,我们可以不严谨地总结一下“拓扑排序就是在找入度0点+更新入度”。

题外话

另外TopNum[i]保存了遍历的顺序。那么能不能TopNum[counter]=i,这样呢。。也可以。因为i和counter肯定是一一映射的关系。如果学习过数据库,那么你就可以说:谁来做主键都可以。

DFS

刘汝佳 算法竞赛入门经典第二版

P167

假设有n个变量,m个二元组(u,v),分别表示u< v。那么寻找一个不等式,包含所有的变量。类似于a< b,b< c ,则输出a< b< c;

我们可以把二元组小于关系看作边关系。这一转换其实很自然。

然后,寻找一个不等式,其实就是在寻找一个拓扑顺序。那么,这个问题其实就是一个拓扑排序,完全可以用BFS完成

但是还有另外一种比较有趣的解法,就是使用dfs。

我们首先定义一个函数

bool dfs(int u);//u代表当前点,返回点u之后是否存在一个拓扑路线

有了这个定义就不难继续做下去了,我们再想到:当前点u若是想能够返回true,那么它所能到达(u->v)的所有点也应该都能。

那么,失败的具体条件是什么?就是成环!

只要之后遍历到的点和之前的点u有关系(v->u),那么就说明成环!返回false。

那么,代码应该是:

int vector> G

int c[maxn];

int TopNum[maxn];

int t;

bool dfs(int u){

c[u]=-1;

for(int i=0;i

if(G[u][i]){

if(c[i]==-1){//大水冲了龙王庙,这个i点在之前已经被遍历到了,成环!

return false;

}

if(!c[i]&&!dfs(i)) return false;

}

//经过了检验

c[u]=1;

TopNum[--t]=u;

return true;

}

bool topsort(){

int t=n;

memset(c,0.sizeof(c));

for(int i=0;i

if(!c[u])

if(!dfs(u))

return false;

return true;

}

python 拓扑排序 dfs bfs_拓扑排序的DFS和BFS相关推荐

  1. python 拓扑排序 dfs bfs_图遍历算法之DFS/BFS

    在计算机科学, 图遍历(Tree Traversal,也称图搜索)是一系列图搜索的算法, 是单次访问树结构类型数据(tree data structure)中每个节点以便检查或更新的一系列机制.图遍历 ...

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

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

  3. 分别使用Kahn和DFS实现拓扑排序

    1,先了解什么是偏序? 偏序就是图中存在无先后顺序的顶点对.全序即找不到这样的顶点对. 2,什么是拓扑排序? 把图由偏序变成全序的操作即是拓扑排序.前提是有向无环图,拓扑才能成功. 3,Kahn算法思 ...

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

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

  5. 拓扑排序及逆拓扑排序

    拓扑排序其实就是对有向无环图的顶点的一种排序,每个顶点出现且只出现一次. 对一个AOV网进行拓扑排序的方法: 1.从AOV网中选择一个入度为0的顶点并输出: 2.从网中删除该顶点和所有以它为起点的有向 ...

  6. CodeForces - 1345E Quantifier Question(dfs实现拓扑序)

    题目链接:点击查看 题目大意:给出 n 个变量以及 m 个不等式,要求给 n 个变量分配作用域,使得所有不等式成立的前提下,"所有"的出现次数最多,给出一种构造方案 题目分析:因为 ...

  7. 使用Python和OpenCV对轮廓进行排序(从左到右,自上而下)

    使用Python和OpenCV对轮廓进行排序(从左到右,自上而下) 1. 效果图 2. 原理 3. 源码 参考 使用轮廓来构建移动文档扫描仪. 使用轮廓来检测图像中的条形码. 利用轮廓来找到从相机到物 ...

  8. python八大选择排序_Python实现选择排序

    选择排序: 选择排序(Selection sort)是一种简单直观的 排序算法 .它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最 ...

  9. 一文读懂Python版的十大经典排序算法(附动图演示)

    来源:大数据DT 本文约5200字,建议阅读10分钟 排序算法是<数据结构与算法>中最基本的算法之一.本文介绍10种常见的内部排序算法,及如何用Python实现. 排序算法可以分为内部排序 ...

最新文章

  1. 职责链模式里面必须要知道的事情
  2. 技术图文:如何利用C# 实现 Prim 最小生成树算法?
  3. mysql 的S 锁和X锁的区别
  4. Exception in thread main java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
  5. python怎么读取excel某一行某一列-python3读取excel文件只提取某些行某些列的值方法...
  6. ML:MLOps系列讲解之《MLOps的定义与发展—你为什么可能想使用机器学习》解读
  7. windbg调试实例(4)--句柄泄露
  8. boost::hana::is_empty用法的测试程序
  9. spark 连接mysql 命令_spark-submit命令包括mysql连接器
  10. 马云:青山不改绿水长流,后会有期
  11. Redis中两种持久化机制RDB和AOF
  12. 御用导航提示提醒_汽车导航,离线和在线哪个好用?两者的区别分析
  13. Python接口自动化之接口依赖
  14. 线程的五大状态及转换
  15. C# 获取项目程序路径的10种方法
  16. SageMath矩阵操作及解线性方程组
  17. 基于Hive解析AST的模仿sqlFlow无中间表的字段级数据血缘的后端
  18. 大力呼吁国内Fil厂商利用IPFS技术赋能实体经济,实现数据安全存储,已十分重要且紧迫了
  19. linux解冻用户的密码,linux – 透明地冻结和解冻进程?
  20. 高德地图的测距api应用记录

热门文章

  1. Windows Live Messenger 8.5 抢先试用
  2. 是什么引起的白头发增多?
  3. c++面试题【转】 面经
  4. WARNING: at net/core/dev.c:1905 skb_warn_bad_offload+0x94/0xb4() 解决思路
  5. 计算机组成流水系统可以,计算机组成原理实验十三建立指令流水系统实验
  6. linux tr 变量大小写,使用tr命令快速达到大小写互换——深圳培训linux
  7. php 数组转对象_[基础编程学习] [PHP7数组详解]:第1章 (8)数组和对象
  8. liu四声拼音怎么读_拼音是99%的西安孩子幼升小必备知识!附:幼小拼音学习计划...
  9. tikhonov正则化 matlab_4 L1和l2正则化详解(花书7.1 参数范数惩罚)
  10. python元组和列表教程_Python列表和元组