分享
  1. 首页
  2. 文章

无向图存储之邻接矩阵实现-Golang版本

u012807459 · · 2912 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

实现一个无向图存储使用邻接矩阵的方式实现,实现语言Golang。


什么是邻接矩阵存储方式 ?

邻接矩阵存储通过一个一维数组,以及一个二维数组完成图的构建。一维数组用于存储图中的每一个顶点,二维数组用于存储图中边或弧的信息。


下图是文章后面将要使用邻接矩阵存储方式实现的图

顶点数组为

{'A', 'B', 'C', 'D'}

边数组(二维数组)是个矩阵形式

 // A B C D
 //A [65536 5 3 6 ]
 //B [ 5 65536 7 65536]
 //C [ 3 7 65536 9 ]
 //D [ 6 65536 9 65536]

一维数组存储每一个顶点,而二维数组以矩阵的形式展现出来就是上面的那个矩阵。 比如第1行第2列,为array[0][1] = 5
表示的就是A到B的边,且该边的权值为5。而因为是无向图,则该矩阵其实是个对称矩阵。另外矩阵中的65536其实就是一个不可能取到的一个权值,因为权值有可能出现为0的情况,所以要用一个绝对不可能是权值的值来作为一个不可能的取值。比如array[0][0] = 65536 即代表A到A的边不存在。


接下来是代码实现

package main
import "fmt"
type VertexType rune // 顶点数值类型
const (
 INFINITY int32 = 65536 // 不可能值
)
//无向图
type AdjacencyMatrix struct {
 Vers []VertexType
 Edges [][]int32
 NumEdges int32
 NumVers int32
}
//用于记录每一条边的两个顶点和权值
type edgeWeightInfo struct {
 v0 int32
 v1 int32
 weight int32
}
//初始化邻接矩阵
//versC 顶点个数
//vers代表顶点集合
//ewi 代表邻接矩阵的每一条边
func (this *AdjacencyMatrix) Init(versC int32, vers []VertexType, ewis []edgeWeightInfo) {
 this.Edges = make([][]int32, versC)
 for i := 0; i < len(this.Edges); i++ {
 this.Edges[i] = make([]int32, versC)
 for index, _ := range this.Edges[i] {
 this.Edges[i][index] = INFINITY //一开始全部初始化为不可能值
 }
 }
 this.Vers = vers
 for _, ewi := range ewis {
 this.Edges[ewi.v0][ewi.v1] = ewi.weight
 //因为是无向图所以是对称矩阵
 this.Edges[ewi.v1][ewi.v0] = ewi.weight
 }
 fmt.Println(this.Edges)
 // A B C D
 //A [65536 5 3 6 ]
 //B [ 5 65536 7 65536]
 //C [ 3 7 65536 9 ]
 //D [ 6 65536 9 65536]
}
func main() {
 var am *AdjacencyMatrix = new(AdjacencyMatrix)
 var vers []VertexType = []VertexType{'A', 'B', 'C', 'D'}
 var ewis []edgeWeightInfo = []edgeWeightInfo{
 edgeWeightInfo{0, 1, 5},
 edgeWeightInfo{0, 2, 3},
 edgeWeightInfo{0, 3, 6},
 edgeWeightInfo{1, 2, 7},
 edgeWeightInfo{2, 3, 9},
 }
 am.Init(4, vers, ewis)
}

有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:u012807459

查看原文:无向图存储之邻接矩阵实现-Golang版本

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
2912 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏