图的深度优先遍历
图的深度优先遍历是图算法中基础算法,一些高级的算法都是这个算法的变种。
深度优先遍历的主要思想:首先以一个未被访问过的顶点作为起始点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