图
图是一种复杂的非线性结构。图G由两个集合V(顶点Vertex)和E(边Edge)组成,定义为G=(V,E)
表示图
有两种主要用于表示图的方式:
邻接表
邻接矩阵
scala邻接矩阵实现图
import java.io.File
import java.util.Scanner
import scala.collection.mutable.ArrayBuffer
class AdjMatrix {
var V = 0 // 顶点
var E = 0 // 边
var adj: Array[Array[Int]] = _ // 二维数组
def createAdjMatrix(filename: String): Unit = {
val file = new File(filename)
val scanner = new Scanner(file)
V = scanner.nextInt()
adj = Array.ofDim[Int](V, V)
E = scanner.nextInt()
for (i <- 0 until E) {
val a = scanner.nextInt()
val b = scanner.nextInt()
adj(a)(b) = 1;
adj(b)(a) = 1
}
}
override def toString: String = {
val stringBuffer = new StringBuffer()
stringBuffer.append(String.format(s"V = ${V}, E= ${E}\n"))
for (i <- 0 until V) {
for (j <- 0 until V) {
stringBuffer.append("\t").append(adj(i)(j))
}
stringBuffer.append("\n")
}
stringBuffer.toString()
}
/**
* 获得 图中顶点的个数
*
* @return
*/
def getV() = {
V
}
/**
* 获得 图中边的个数
*
* @return
*/
def getE() = {
E
}
/**
* 两个顶点间是否有边
*
* @param v
* @param w
* @return
*/
def hasEdge(v: Int, w: Int) = {
adj(v)(w) == 1
}
/**
* 获取v的所有邻边
*
* @param v
* @return
*/
def getAdjacentSide(v: Int) = {
var arr = ArrayBuffer[Int]()
for (i <- 0 until V) {
if (this.adj(v)(i) == 1) {
arr += i
}
}
arr.toList
}
}
object AdjMatrix {
def apply(): AdjMatrix = new AdjMatrix()
def main(args: Array[String]): Unit = {
println("-----------")
val adjMatrix = AdjMatrix()
adjMatrix.createAdjMatrix("./data/graph/g.txt")
println(adjMatrix)
println("-------------------------")
println(s"顶点个数:${adjMatrix.getV()}")
println("-------------------------")
println(s"边的个数:${adjMatrix.getE()}")
println("-------------------------")
println(s"2的邻边:${adjMatrix.getAdjacentSide(2)}")
println("-------------------------")
println(s"1 和 2 是否有边:${adjMatrix.hasEdge(1, 2)}")
}
}
通过加载 g.txt 文件构建图
7 9
0 1
0 3
1 2
1 6
2 3
2 5
3 4
4 5
5 6
运行结果
V = 7, E= 9
0 1 0 1 0 0 0
1 0 1 0 0 0 1
0 1 0 1 0 1 0
1 0 1 0 1 0 0
0 0 0 1 0 1 0
0 0 1 0 1 0 1
0 1 0 0 0 1 0
-------------------------
顶点个数:7
-------------------------
边的个数:9
-------------------------
2的邻边:List(1, 3, 5)
-------------------------
1 和 2 是否有边:true