圖的深度優先遍歷
圖的深度優先遍歷是圖算法中基礎算法,一些高級的算法都是這個算法的變種。
深度優先遍歷的主要思想:首先以一個未被訪問過的頂點作爲起始點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