數據結構 -- 圖的深度優先遍歷(scala版)

圖的深度優先遍歷

圖的深度優先遍歷是圖算法中基礎算法,一些高級的算法都是這個算法的變種。
深度優先遍歷的主要思想:首先以一個未被訪問過的頂點作爲起始點v,依次從未訪問的鄰接點出發對圖進行遍歷,直到圖中和v相連的頂點都被訪問到,若圖中有未被訪問的則從一個未被訪問的頂點出發重新進行遍歷。


scala實現圖的深度優先遍歷

import scala.collection.mutable.ArrayBuffer

class GraphDFS {
  var G: Graph = _
  var visited: Array[Boolean] = _
  var pre_order: ArrayBuffer[Int] = _
  var post_order: ArrayBuffer[Int] = _

  def this(graph: Graph) = {
    this()
    G = graph
    visited = Array.ofDim[Boolean](graph.getV())
    pre_order = new ArrayBuffer[Int]()
    post_order = new ArrayBuffer[Int]()
    for (i <- 0 until visited.length) {
      if (!visited(i)) {
        dfs(i)
      }
    }
    this
  }

  /**
   * 深度優先遍歷
   *
   * @param v
   */
  def dfs(v: Int): Unit = {
    visited(v) = true
    pre_order += v
    for (x <- G.getAdjacentSide(v)) {
      if (!visited(x)) {
        dfs(x)
      }
    }
    post_order += v
  }

  /**
   * 前序遍歷
   *
   * @return
   */
  def preOrder(): List[Int] = {
    pre_order.toList
  }

  /**
   * 後序遍歷
   *
   * @return
   */
  def postOrder(): List[Int] = {
    post_order.toList
  }
}

object GraphDFS {
  def apply(graph: Graph): GraphDFS = {
    new GraphDFS(graph)
  }

  def apply(): GraphDFS = new GraphDFS()

  def main(args: Array[String]): Unit = {
    val graph = Graph().createGraph("./data/graph/g.txt")
    val graphDFS = GraphDFS(graph)
    println(graphDFS.preOrder())
    println(graphDFS.postOrder())
  }
}


// List(0, 1, 2, 3, 5, 6, 4)
// List(3, 5, 2, 6, 1, 0, 4)

g.txt

7 6
0 1
0 3
1 2
1 6
2 3
2 5

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章