美文网首页Haskell
[Haskell] DFS与BFS

[Haskell] DFS与BFS

作者: 何幻 | 来源:发表于2017-03-27 13:59 被阅读100次

1. DFS

import Data.Ix
import Graph
import Stack 

depthFirstSearch :: Ix a => a -> Graph a a -> [a]
depthFirstSearch start g = dfs [start] []
    where 
        dfs [] vis = vis 
        dfs (c:cs) vis | elem c vis = dfs cs vis 
                       | otherwise  = dfs ((adjacent g c) ++ cs) (vis ++ [c]) 

depthFirstSearch' :: Ix a => a -> Graph a a -> [a]
depthFirstSearch' start g = reverse $ dfs [start] []
    where 
        dfs [] vis = vis 
        dfs (c:cs) vis | elem c vis = dfs cs vis 
                       | otherwise  = dfs ((adjacent g c) ++ cs) (c:vis)

depthFirstSearch'' :: Ix a => a -> Graph a a -> [a]
depthFirstSearch'' start g = reverse $ dfs (push start emptyStack) []
    where 
        dfs s vis | (stackEmpty s) = vis 
                  | elem (top s) vis = dfs (pop s) vis 
                  | otherwise = let c = top s 
                                in 
                                    dfs (foldr push (pop s) (adjacent g c))
                                        (c:vis)

2. BFS

import Data.Ix
import Graph
import Queue

breadFirstSearch :: Ix a => a -> Graph a a -> [a]
breadFirstSearch start g = reverse (bfs (enqueue start emptyQueue) [])
    where 
        bfs q vis | (queueEmpty q) = vis 
                  | elem (front q) vis = bfs (dequeue q) vis 
                  | otherwise = let c = front q
                                in
                                    bfs (foldr enqueue 
                                               (dequeue q)
                                               (adjacent g c))
                                        (c:vis)

参考

Algorithms: A Functional Programming Approach
Stack
Queue
Graph - 邻接表
Graph - 邻接矩阵

相关文章

  • [Haskell] DFS与BFS

    1. DFS 2. BFS 参考 Algorithms: A Functional Programming App...

  • 用Python实现树的BFS与DFS

    一、BFS与DFS简介 在理解动态规划、BFS和DFS一文中,已经集合具体例子,介绍了图的BFS与DFS。但是比较...

  • Binary Tree(2)

    BFS vs DFS for Binary Tree What are BFS and DFS for Binar...

  • DFS与BFS LeetCode 刷题小结(一)

    本节我们将汇总一些 LeetCode bfs与dfs相关的题。 关于深度优先搜索(DFS)和广度优先搜索(BFS)...

  • LeetCode 第104题:二叉树的最大深度

    1、前言 2、思路 采用 DFS 或者 BFS 都可以。 3、代码 DFS: BFS:

  • 133. Clone Graph 复制无向图

    bfs dfs

  • BFS和DFS

    DFS BFS

  • BFS与DFS

    广度优先遍历 (BFS) 类似树的层次遍历,首先访问起始顶点v,然后选取与v邻接的全部顶点w1,w2,…wn,进行...

  • DFS与BFS

    以先序遍历打印链表为例: 以中序遍历打印链表为例: 以后序遍历打印链表为例: 以层序遍历打印链表为例:

  • BFS与DFS

    1.什么是BFS,DFS BFS宽度优先搜索.一层一层搜索.把每行的结果存入到队列中,然后遍历求下一层.DFS深度...

网友评论

    本文标题:[Haskell] DFS与BFS

    本文链接:https://www.haomeiwen.com/subject/fmkrottx.html