参考链接:https://blog.csdn.net/u014281392/article/details/79120406

所描述的图的结构为:

下面介绍不同的储存方式,我想不必详细分别是每个名称都是那种数据来存储的,或是一种,或是两种的组合,这不是再通用的规定约束而来的结果,只是列举了一些灵活的组合而已。

1.邻接集合

邻接集合就是把顶点的邻接点放在一个集合中

# 将节点的编号赋值给相应的节点,方便操作
a, b, c, d, e, f, g, h = range(8)
N = [{'b', 'c', 'd', 'e', 'f'},
{'c', 'e'},
{'d'},
{'e'},
{'f'},
{'c', 'g', 'h'},
{'f', 'h'},
{'f', 'g'}]
列表中每个集合是每个节点邻接点集
在python2.7中,set([1,3])这样表示,set()表示空集合.
在python3之后的版中,set{1,3}表示集合,空集合仍用set()表示.

  

#查看a的邻接节点有哪些
N[a] {'b', 'c', 'd', 'e', 'f'} # 检查g是否为a的一个邻接节点
'g' in N[a] False # 节点a的度
len(N[a]) 5

  

2.邻接列表

数据结构和邻接集合差不多,唯一的不同是用列表来储存

# 表示同一个图
a, b, c, d, e, f, g, h = range(8)
N = [ ['b', 'c', 'd', 'e', 'f'],
['c', 'e'],
['d'],
['e'],
['f'],
['c', 'g', 'h'],
['f', 'h'],
['f', 'g'] ]
# 邻接列表表示图结构,与邻接集合的操作相同

  

3.邻接字典

临界字典与前面两个的不同之处在于,其不仅采用字典来储存,字典是键值对,键值对中的value用来表示边的权值这一信息,能表示出与邻居节点之间的关联性

a, b, c, d, e, f, g, h = range(8)
N = [{'b':2, 'c':1, 'd':3, 'e':9, 'f':4},
{'c':4, 'e':3},
{'d':8},
{'e':7},
{'f':5},
{'c':2, 'g':2, 'h':2},
{'f':1, 'h':6},
{'f':9, 'g':8}] #操作
'e' in N[a]
True 边的权值
N[a]['c'] 1

  

4.嵌套字典

不用添加序号了

# 以上三种图的表示,都是使用了list类型
# 下面使用嵌套的字典结构
N = {'a':{'b':2, 'c':1, 'd':3, 'e':9, 'f':4},
'b':{'c':4, 'e':3},
'c':{'d':8},
'd':{'e':7},
'e':{'f':5},
'f':{'c':2, 'g':2, 'h':2},
'g':{'f':1, 'h':6},
'h':{'f':9, 'g':8}}

  其他的操作和别的结构相同

# a,e之间链接权值
N['a']['e']

  

4.邻接矩阵

# 邻接矩阵,通过一个二维数组,对应图中的每个节点,使用0,1来表示相关节点是否为当前节点的邻居
# 可以使用嵌套list实现
a, b, c, d, e, f, g, h = range(8) N = [[0, 1, 1, 1, 1, 1, 0, 0],
[0, 0, 1, 0, 1, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0],
[0, 0, 1, 0, 0, 0, 1, 1],
[0, 0, 0, 0, 0, 1, 0, 1],
[0, 0, 0, 0, 0, 1, 1, 0]]

  

# 检查a, b是否为相邻节点,即检查N[a][b]是否为1
N[a][b] == 1 True

  

# c节点的度 sum(N[c])

扩展邻接矩阵,实现一个没有自循环,对边加权 、无自循环状态,对角线元素全部为0 、加权,用权值替换真值 、将不存在的边设置一个去穷大的权值(float('inf')),或None

a, b, c, d, e, f, g, h = range(8)
inf = float('inf') N = [[ 0, 2, 1, 3, 9, 4, inf, inf],
[inf, 0, 4, inf, 3, inf, inf, inf],
[inf, inf, 0, 8, inf, inf, inf, inf],
[inf, inf, inf, 0, 7, inf, inf, inf],
[inf, inf, inf, inf, 0, 5, inf, inf],
[inf, inf, 2, inf, inf, 0, 2, 2],
[inf, inf, inf, inf, inf, 1, 0, 6],
[inf, inf, inf, inf, inf, 9, 8, 0]]

  

# 检查a,b是否互为相邻节点,只要邻接权值不是无穷大
N[a][b] < inf

  

最新文章

  1. js学习之函数的参数传递
  2. C++ 实现Range类,用于常规遍历
  3. IT行业找工作难
  4. ae 打开地图文档
  5. js 中escape,encodeURI,encodeURIComponent的区别
  6. BI案例:某公司BI系统的九大主题分析
  7. WAMP Server助你在Windows上快速搭建PHP集成环境
  8. iis下设置默认页
  9. WPF中如何使用图像API进行绘制
  10. VirtualBox修改虚拟盘路径
  11. MySQL--query-cache
  12. 开源日志库log4cplus+VS2008使用
  13. QML基础(六篇文章)
  14. leetcode 最长连续序列 longest consecutive sequence
  15. HDU 2454 Degree Sequence of Graph G(Havel定理 推断一个简单图的存在)
  16. html5 音频和视频(audio And video)
  17. 关于Mybatis的一次pingQuery时间间隔的实践及思考
  18. go并发调度原理学习
  19. Vsphere 回收未消使用的磁盘空间
  20. HTML学习笔记Day14

热门文章

  1. 1_ZedBoard开发板测试
  2. Bert实战---情感分类
  3. JS高阶---进程与线程
  4. Vue-cli 中安装并使用less
  5. JQuery:
  6. AI AND THE BOTTOM LINE: 15 EXAMPLES OF ARTIFICIAL INTELLIGENCE IN FINANCE
  7. LeetCode 153. Find Minimum in Rotated Sorted Array寻找旋转排序数组中的最小值 (C++)
  8. P3273 【[SCOI2011]棘手的操作】
  9. centos7.5安装java JDK、tomcat、mysql
  10. 实验二 Java基础(数据/表达式、判定/循环语句)