zoukankan      html  css  js  c++  java
  • 图的遍历算法

    前言

    图的遍历算法是求解图的连通性问题、拓扑排序和求关键路径等算法的基础。

    通常有两种遍历图的方式:广度优先和深度优先(有无向图和有向图都适用),下面以有向图为例给出基于python的两种实现。

    已知图如下所示:

    广度优先搜索

    from collections import deque
    
    VISITED = []
    
    # breadth first search
    def bfs(d):
    	VISITED.append("v1")
    	q = deque()
    	q += d["v1"]
    	while q:
    		item = q.popleft()  # first in first out
    		if item not in VISITED:
    			VISITED.append(item)
    			q += d[item]
    
    if __name__ == "__main__":
    	d = {}
    	d["v1"] = ["v2", "v3", "v4"]
    	d["v2"] = ["v5", "v6"]
    	d["v3"] = ["v9"]
    	d["v4"] = ["v7", "v8"]
    	d["v5"] = ["v9"]
    	d["v6"] = ["v9"]
    	d["v7"] = []
    	d["v8"] = ["v10"]
    	d["v9"] = []
    	d["v10"] = ["v9"]
    	bfs(d)
    	print(VISITED)
    
    # ['v1', 'v2', 'v3', 'v4', 'v5', 'v6', 'v9', 'v7', 'v8', 'v10']

    深度优先搜索

    深度优先搜索存在一个回溯的过程,所以使用递归来实现,因为递归本身保存了调用栈。

    VISITED = []
    
    def recurse(items, d):
    	if not items:
    		return None
    	for item in items:
    		if item not in VISITED:
    			VISITED.append(item)
    			recurse(d[item], d)
    
    # depth first search
    def dfs(d):
    	VISITED.append("v1")
    	recurse(d["v1"], d)
    
    if __name__ == "__main__":
    	d = {}
    	d["v1"] = ["v2", "v3", "v4"]
    	d["v2"] = ["v5", "v6"]
    	d["v3"] = ["v9"]
    	d["v4"] = ["v7", "v8"]
    	d["v5"] = ["v9"]
    	d["v6"] = ["v9"]
    	d["v7"] = []
    	d["v8"] = ["v10"]
    	d["v9"] = []
    	d["v10"] = ["v9"]
    	dfs(d)
    	print(VISITED)
    
    # ['v1', 'v2', 'v5', 'v9', 'v6', 'v3', 'v4', 'v7', 'v8', 'v10']
    

      

    作者:Standby一生热爱名山大川、草原沙漠,还有妹子
    出处:http://www.cnblogs.com/standby/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    EcShop二次开发学习方法
    [ 产品经理 ] 互联网产品经理常用软件及工作平台
    Tengine – Nginx衍生版
    把PHP大牛记下来,方便以后关注
    看了极光推送技术原理的几点思考
    centos磁盘满了,查找大文件并清理
    LNMP一键安装包 PHP自动升级脚本
    微信红包系统设计 & 优化
    程序员每天每周每月每年该做的事
    php中$_REQUEST、$_POST、$_GET的区别和联系小结
  • 原文地址:https://www.cnblogs.com/standby/p/14420278.html
Copyright © 2011-2022 走看看