数据结构 -- 图的基本表示:邻接矩阵 (scala版)

图是一种复杂的非线性结构。图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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值