Day02 图理论基础笔记1

图的定义

被记为 ${G}=\{​{V}, {E}\}$

其中V是节点(node或vertex)的集合,E是边(edge或link)的集合

有向图(directed graph or digraph):带箭头的边。

无向图(undirected graph):边不具备指向性。

 案例:通过 NetworkX 创建一个简单的图

准备:安装第三方库

pip install networkx -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple

绘制两个点,连接他们

# 导入包
import matplotlib.pyplot
import networkx
# 创建一个空图
graph = networkx.Graph()
# 添加节点1
graph.add_node(1)
# 添加节点2
graph.add_node(2)
# 添加节点1和2之间的边
graph.add_edge(1, 2)
# 绘制图形
networkx.draw(graph)
# 显示图形
matplotlib.pyplot.show()

add_edge:当添加的边对应的节点不存在的时候,自动创建相应的节点
# 导入包
import matplotlib.pyplot
import networkx
# 创建一个空图
graph = networkx.Graph()
# 如果没有定义点,将自动生成,如点2点3
graph.add_edge(2, 3)
# 绘制图形
networkx.draw(graph)
# 显示图形
matplotlib.pyplot.show()

默认创建无向图

# 导入包
import networkx
# 创建一个默认图
graph = networkx.Graph()
# 打印出图是否为有向图
print(graph.is_directed())
False

DiGraph():创建有向图

# 导入包
import networkx
# 创建一个有向图
graph = networkx.DiGraph()
# 打印出图是否为有向图
print(graph.is_directed())
True

添加权重,显示标签

import matplotlib.pyplot as plt
import networkx as nx

# 创建一个带权重的图  
G = nx.Graph()
# 添加带权重的边  
G.add_edge('A', 'B', weight=2)
G.add_edge('B', 'C', weight=3)
G.add_edge('C', 'D', weight=1)
G.add_edge('D', 'A', weight=4)
# 绘制图形并显示权重
edge_labels = nx.get_edge_attributes(G, 'weight')
nx.draw(G, with_labels=True)
nx.draw_networkx_edge_labels(G, pos=nx.spring_layout(G), edge_labels=edge_labels)
plt.show()

图的性质

节点的邻接节点是与节点直接相连的节点。

无向图出度与入度相等。

平均度:无向图的平均度2倍边数量除以节点数量。

案例:网络平均度的计算

以NetworkX 中自带的图 The Karate Club Network(空手道俱乐部网络)为例

import matplotlib.pyplot as plt
import networkx as nx


# 绘制空手道俱乐部图
def draw_karate_club_graph():
    # 创建空手道俱乐部图
    G = nx.karate_club_graph()
    # 显示图的类型
    print(type(G))
    # 绘制图,并显示节点标签
    nx.draw(G, with_labels=True)
    plt.show()
    return G


# 计算网络的平均度
def average_degree(graph):
    # 获取图的边数和节点数
    num_edges = graph.number_of_edges()
    num_nodes = graph.number_of_nodes()
    # 计算平均度(每个节点的平均连接数)
    avg_degree = 2 * num_edges / num_nodes
    # 四舍五入后返回平均度的整数值
    avg_degree = round(avg_degree)
    return avg_degree


# 调用函数绘制空手道俱乐部图  
G = draw_karate_club_graph()

# 计算并打印空手道俱乐部网络的平均度
avg_degree = average_degree(G)
print("空手道俱乐部网络平均度:{}".format(avg_degree))
<class 'networkx.classes.graph.Graph'>
空手道俱乐部网络平均度:5

行走$walk(v_1, v_2) = (v_1, e_6,e_5,e_4,e_1,v_2)$

从节点$v_1$出发,依次经过边$e_6,e_5,e_4,e_1$,最终到达$v_2$ 的行走。

行走节点是允许重复

路径是节点不可重复的行走

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值