算法-图的几种表示方法

表示如下的一个图有哪些方法呢,


import numpy as np
1.邻接矩阵

图的一种常见的表示方法就是邻接矩阵了,这种表示的主要不同之处在于,它不在列出每个节点的所有邻居节点,而是会将每个节点的可能的邻居位置排成一排 也就是一个数组,用于对应图的每一个节点,然后用某种值,如True或false来表示相关节点是否是当前节点的邻居。其最简单的形式也可用嵌套list来实现。


a,b,c,d,e,f,g,h=range(8)
N=[
    [0,1,1,0,1,0,1,0,1],
    [0,1,1,0,1,0,1,0,1],
    [0,1,1,0,1,0,1,0,1],
    [0,1,1,0,1,0,1,0,1],
    [0,1,1,0,1,0,1,0,1],
    [0,1,1,0,1,0,1,0,1],
    [0,1,1,0,1,0,1,0,1],
    [0,1,1,0,1,0,1,0,1]
]
​
#1.判断ab是否存在链接
is_conn=N[a][b]
#2.获取a有多少个相连接节点
nodes=np.sum(N[a])
#3.遍历所有节点
for i in N:
    print(i)
#4.增加一个节点,较为麻烦,创建一列向量,vstack(N,x),然后遍历所有N[m][x],赋值
is_conn,nodes
[0, 1, 1, 0, 1, 0, 1, 0, 1]
[0, 1, 1, 0, 1, 0, 1, 0, 1]
[0, 1, 1, 0, 1, 0, 1, 0, 1]
[0, 1, 1, 0, 1, 0, 1, 0, 1]
[0, 1, 1, 0, 1, 0, 1, 0, 1]
[0, 1, 1, 0, 1, 0, 1, 0, 1]
[0, 1, 1, 0, 1, 0, 1, 0, 1]
[0, 1, 1, 0, 1, 0, 1, 0, 1]
(1, 5)
2.图的另一种表现方式:加权邻接字典

在加权邻接字典中,每个邻居节点会有一个键和一个额外的值,表示与邻居节点之间的权重(关联性)


a,b,c,d,e,f,g,h=range(8)
N=[
    {b:2,c:3,d:4,e:5},
    {b:2,c:3,d:4,e:5},
    {b:2,c:3,d:4,e:5},
    {b:2,c:3,d:4,e:5},
    {b:2,c:3,d:4,e:5},
    {b:2,c:3,d:4,e:5},
    {b:2,c:3,d:4,e:5},
    {b:2,c:3,d:4,e:5},
]
​

#在加权邻接字典中可以方便的实现:
#1.检查ab是否互为链接
is_conn=N[a][b]
#2.获取a共有多少邻接节点
lenn=len(N[a])
#3.遍历所有节点
for i in N:
    print(i)
#4.增加一个节点,只需要在最后增加一个{},并且在有链接的地方赋值即可如:
x={a:2}
N.append(x)
N[a][9]=2
#5.可以方便的遍历a的临界邻居节点
for i in N[a]:
    print(i)
is_conn,lenn,
{1: 2, 2: 3, 3: 4, 4: 5}
{1: 2, 2: 3, 3: 4, 4: 5}
{1: 2, 2: 3, 3: 4, 4: 5}
{1: 2, 2: 3, 3: 4, 4: 5}
{1: 2, 2: 3, 3: 4, 4: 5}
{1: 2, 2: 3, 3: 4, 4: 5}
{1: 2, 2: 3, 3: 4, 4: 5}
{1: 2, 2: 3, 3: 4, 4: 5}
1
2
3
4
9
(2, 4)
3.图的加权邻接字典,还可以用dict代替set或list


a,b,c,d,e,f,g,h=range(8)
N={
    'a':set('bcdef'),
    'b':set('bcdef'),
    'c':set('bcdef'),
    'd':set('bcdef'),
    'e':set('bcdef'),
    'f':set('bcdef'),
    'g':set('bcdef'),
    'h':set('bcdef'),
}
​
#同样具有以下几种有点
#1.获取ab是否互为节点
is_conn='b' in N['a']
#2.获取a共有几个邻接节点
lenn=len(N['a'])
#3.遍历所有节点
for i in N:
    print(N[i])
#4.获取a中的所有邻接节点
for i in N['a']:
    print(i)
#5.增加一个节点,只需要增加一个键值对,然后在有链接的地方增加一个i值
N['i']=set('abcd')
is_conn,lenn
​
{'d', 'f', 'c', 'e', 'b'}
{'d', 'f', 'c', 'e', 'b'}
{'d', 'f', 'c', 'e', 'b'}
{'d', 'f', 'c', 'e', 'b'}
{'d', 'f', 'c', 'e', 'b'}
{'d', 'f', 'c', 'e', 'b'}
{'d', 'f', 'c', 'e', 'b'}
{'d', 'f', 'c', 'e', 'b'}
d
f
c
e
b
(True, 5)
4.图也可以用邻接列表来表示


a,b,c,d,e,f,g,h=range(8)
N=[
    [b,c,d,f,g],#a
    [b,c,d,f,g],#b
    [b,c,d,f,g],
    [b,c,d,f,g],
    [b,c,d,f,g],
    [b,c,d,f,g],
    [b,c,d,f,g],
    [b,c,d,f,g],
]
#同样也可以方便的实现图的各种功能
5.图的邻接集表示法


a,b,c,d,e,f,g,h=range(8)
N=[
    {b,c,e,d},#a
    {b,c,e,d},#b
    {b,c,e,d},#c
    {b,c,e,d},#d
    {b,c,e,d},#e
    {b,c,e,d},#f
    {b,c,e,d},#g
    {b,c,e,d},#h
]

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值