目录

  • 图的定义
  • 无向边
  • 无向图
  • 有向边
  • 有向图
  • 无向完全图
  • 有向完全图
  • 稀疏图、稠密图、权、网
  • 子图
  • 路径长度
  • 回路或环、简单路径、简单回路或简单环
  • 连通图相关术语
  • 连通图
  • 连通分量
  • 强连通图、强连通分量
  • 生成树
  • 有向树、生成森林
  • 总结


图的定义


图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。

网络中的点通常称为节点(Node);图中的点则常称为顶点(Vertex)
线性表中数据元素叫做元素;树中将数据元素叫做结点;在图中数据元素叫做顶点(Vertex)

无向边

若顶点\(V_i\)到\(V_j\)之间的边没有方向,则称这条边为无向边(Edge),用无序偶对(\(V_i\),\(V_j\))表示。简化写成\(e_{ij}\)

无向图

如果图中任意两个顶点之间的边都是无向边,则称该图为无向图(Undirected graphs)。

图节点回归问题 图的节点_图节点回归问题

Code Implementation(Python)

# 需要导入networkx、matplotlib库
import networkx as nx
import matplotlib.pyplot as plt
# 创建对象
G = nx.Graph()
V = ["V1", "V2", "V3", "V4", "V5"]  # 一个元组
# 添加地顶点
G.add_nodes_from(V)
# 通过添加list来添加多条边
G.add_edges_from([("V1", "V2"), ("V1", "V3"), ("V1", "V5"), ("V2", "V5"), ("V2", "V4"), ("V2", "V3"),
                  ("V3", "V4")])  
# circular_layout:表示节点在一个圆环上均匀分布
pos = nx.circular_layout(G)  
nx.draw(G,
        pos=pos,
        with_labels=True,  # 节点是否带标签,默认True
        node_size=800,  # 节点大小,默认300
        node_color='#66CCFF',  # 节点颜色,默认red
        font_color='white',  # 节点标签的字的颜色,默认黑色
        node_shape='o',  # 节点形状,默认’o’
        alpha=1,  # 透明度,默认1,不透明
        edge_color='#CCFFFF',  # 边的颜色,默认黑色
        width=3,  # 边的宽度,默认1
        style='solid',  # 边的样式,默认为实线,可选择solid、dashed、dotted、dashdot
        font_size=15  # 字体大小,默认12
        )
# 添加边的属性说明
edge_labels = {  
    ("V1", "V2"): "e12",
    ("V1", "V3"): "e13",
    ("V1", "V5"): "e15",
    ("V2", "V5"): "e25",
    ("V2", "V4"): "e24",
    ("V2", "V3"): "e23",
    ("V3", "V4"): "e34"
}
nx.draw_networkx_edge_labels(G,
                             pos,
                             edge_labels=edge_labels,
                             font_color="black"  # 属性说明的字体颜色
                             )
plt.show()

上图就是一个无向图。

  • 由于是无向的,则有 \(e_{ij}\)=\(e_{ji}\)
    即顶点\(V_1\)到顶点\(V_2\)的边,既可以写成\(e_{12}\),也可以写成 \(e_{21}\)
  • 上图可以表示为G(V,E)
    其中顶点集合V={\(V_1,V_2,V_3,V_4,V_5\)},边集合E={\((V_1,V_2),(V_1,V_3),(V_1,V_5),(V_2,V_5),(V_2,V_4),(V_2,V_3),(V_3,V_4)\)}

有向边

若顶点\(V_i\)到\(V_j\)之间的边有方向,则称这条边为有向边(Edge),也称为弧(Arc),用有序偶对<\(V_i\),\(V_j\)>表示,\(V_i\)称为弧尾(Tail),\(V_j\)称为弧头(Head)

有向图

如果图中任意两个顶点之间的边都是有向边,则称该图为无向图(Directed graphs)。

图节点回归问题 图的节点_有向图_02

Code Implementation(Python)

# 需要导入networkx、matplotlib库
import networkx as nx
import matplotlib.pyplot as plt
# 创建对象
G = nx.DiGraph()
V = ["V1", "V2", "V3", "V4", "V5"]  # 一个元组
# 添加地顶点
G.add_nodes_from(V)
# 通过添加list来添加多条边
G.add_edges_from([("V1", "V2"), ("V1", "V3"), ("V1", "V5"), ("V2", "V5"), ("V2", "V4"), ("V2", "V3"),
                  ("V3", "V4")])
# circular_layout:表示节点在一个圆环上均匀分布
pos = nx.circular_layout(G)
nx.draw(G,
        pos=pos,
        with_labels=True,  # 节点是否带标签,默认True
        node_size=800,  # 节点大小,默认300
        node_color='#66CCFF',  # 节点颜色,默认red
        font_color='white',  # 节点标签的字的颜色,默认黑色
        node_shape='o',  # 节点形状,默认’o’
        alpha=1,  # 透明度,默认1,不透明
        edge_color='#CCFFFF',  # 边的颜色,默认黑色
        width=3,  # 边的宽度,默认1
        style='solid',  # 边的样式,默认为实线,可选择solid、dashed、dotted、dashdot
        font_size=15,  # 字体大小,默认12
        arrowstyle="->",  # 指定箭头样式
        arrowsize=20  # 指定箭头大小
        )
# 添加边的属性说明
edge_labels = {
    ("V1", "V2"): "e12",
    ("V1", "V3"): "e13",
    ("V1", "V5"): "e15",
    ("V2", "V5"): "e25",
    ("V2", "V4"): "e24",
    ("V2", "V3"): "e23",
    ("V3", "V4"): "e34"
}
nx.draw_networkx_edge_labels(G,
                             pos,
                             edge_labels=edge_labels,
                             font_color="black"  # 属性说明的字体颜色
                             )
plt.show()

上图就是一个有向图。

  • 由于是有向的,则有 \(e_{ij}\)≠\(e_{ji}\)
    即顶点\(V_1\)到顶点\(V_2\)的边是有向边,即弧,\(V_1\)是弧尾,\(V_2\)是弧头,<\(V_1\),\(V_2\)>表示弧,注意不能写成<\(V_2\),\(V_1\)>
  • 上图可以表示为G(V,E)
    其中顶点集合V={\(V_1,V_2,V_3,V_4,V_5\)},边集合E={\(<V_1,V_2>,<V_1,V_3>,<V_1,V_5>,<V_2,V_5>,<V_2,V_4>,<V_2,V_3>,<V_3,V_4>\)}

无向完全图

在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图。

含有n个顶点的无向完全图有\(\frac{n×(n-1)}{2}\)条边

下图就是无向完全图,因为每个顶点都要与除它以外的顶点连线,顶点A与BCD三个顶点连线,共有四个顶点,自然是4×3,但由于顶点A与顶点B连线后,计算B与A连线就是重复,因此要整体除以2,共有6条边。

图节点回归问题 图的节点_图节点回归问题_03

有向完全图

在有向图中,如果任意两个顶点之间都存在方向互为相反的两条弧,则称该图为有向完全图。

含有n个顶点的有向完全图有\(n× (n-1)\)条边

图节点回归问题 图的节点_图节点回归问题_04

对于具有n个顶点和e条边数的图,无向图0≤e≤\(\frac{n×(n-1)}{2}\),有向图0≤e≤\(n (n-1)\)。

稀疏图、稠密图、权、网

有很少条边或弧的图称为稀疏图,反之称为稠密图。这里稀疏和稠密是模糊的概念,都是相对而言的。

有些图的边或弧具有与它相关的数字,这种与图的边或弧相关的数叫做权(Weight)。这些权可以表示从一个顶点到另一个顶点的距离或耗费。

这种带权的图通常称为网(Network)。下图就是一张带权的图,即标识中国四大城市的直线距离的网,此图中的权就是两地的距离。

图节点回归问题 图的节点_子图_05

子图

假设有两个图G= (V,E) 和 G'= (\(V^',E^‘),如果V^'被包含于V且E^'被包含于E,则称G^'为G的\)子图(Subgraph)

如下图带底纹的图均为左侧无向图与有向图的子图。

图节点回归问题 图的节点_有向图_06

对于上图中的无向图。顶点V的度(Degree)是和V相关联的边的数目,记为TD (v)。

  • 顶点A与B互为邻接点,边(A,B)依附于顶点A与B上,顶点A的度为3。而此图的边数是5,各个顶点度的和=3+2+3+2=10,推敲后发现,边数其实就是各顶点度数和的一半,多出的一半是因为重复两次记数。简记之:\[e = \frac{1}{2}\sum_{i=1}^{n} TD(V_i) \]

对于上图中的有向图。以顶点V为头的弧的数目称为V的入度(InDegree),记为ID(v);以V为尾的弧的数目称为V的出度(OutDegree),记为OD(v);顶点V的度为 TD(v)=ID (v)+OD (v)。

  • 顶点A的入度是2(从B到A的弧,从C到A的弧),出度是1(从A到D的弧),所以顶点A的度为2+1=3。此有向图的弧有4条,而各顶点的出度和=1+2+1+0=4,各顶点的入度和=2+0+1+1=4。所以得到:\[e = \sum_{i=1}^{n} ID(V_i)= \sum_{i=1}^{n} OD(V_i) \]

路径长度

路径的长度是路径上的边或弧的数目。

图节点回归问题 图的节点_子图_07

回路或环、简单路径、简单回路或简单环

第一个顶点到最后一个顶点相同的路径称为回路或环(Cyce)。序列中顶点不重复出现的路径称为简单路径

除了第一个顶点和最后一个顶点之外,其余顶点不重复出现的回路,称为简单回路或简单环

下图两个图的粗线都构成环,左侧的环因第一个顶点和最后一个顶点都是B,且C、D、A 没有重复出现,因此是一个简单环。而右侧的环,由于顶点C的重复,它就不是简单环了。

图节点回归问题 图的节点_有向图_08


连通图相关术语


连通图

在无向图G中,如果从顶点V到顶点\(V^’\)有路径,则称V和\(V^’\)是连通的。

如果对于图中任意两个顶点\(V_i\)、\(V_j\)∈E, \(V_i\)和\(V_j\)都是连通的,则称G是连通图(ConnectedGraph)

下图的图1,它的顶点A到顶点B、C、D 都是连通的,但显然顶点A与顶点E或F就无路径,因此不能算是连通图。图2,顶点A、B、C、D相互都是连通的,所以它本身是连通图。

图节点回归问题 图的节点_有向图_09

连通分量

无向图中的极大连通子图称为连通分量。注意连通分量的概念,它强调:

  • 要是子图;
  • 子图要是连通的;
  • 连通子图含有极大顶点数;
  • 具有极大顶点数的连通子图包含依附于这些顶点的所有边。

下图的图1是一个无向非连通图。但是它有两个连通分量,即图2和图3。而图4,尽管是图1的子图,但是它却不满足连通子图的极大顶点数(图2满足)。因此它不是图1的无向图的连通分量。

图节点回归问题 图的节点_无向图_10

强连通图、强连通分量

在有向图G中,如果对于每一对\(V_i、V_j ∈ V、V_i≠V_j ,从V_i到V_j 和从V_j 到V_i 都\)存在路径,则称G是强连通图

有向图中的极大强连通子图称做有向图的强连通分量

例如下图,图1并不是强连通图,因为顶点A到顶点D存在路径,而D到A就不存在。图2就是强连通图,而且显然图2是图1的极大强连通子图,即是它的强连通分量。

图节点回归问题 图的节点_有向图_11

生成树

一个连通图的生成树是一个极小的连通子图,它含有图中全部的n个顶点,但只有足以构成一棵树的n-1条边。

比如下图的图1是一普通图,但显然它不是生成树,当去掉两条构成环的边后,比如图2或图3,就满足n个顶点n-1条边且连通的定义了。它们都是一棵生成树。

从这里也可知道,如果一个图有n个顶点和小于n-1条边,则是非连通图,如果它多于n-1边条,必定构成一个环,因为这条边使得它依附的那两个顶点之间有了第二条路径。比如图2和图3,随便加哪两顶点的边都将构成环。不过有n-1条边并不一定是生成树,比如图4。

图节点回归问题 图的节点_图节点回归问题_12

有向树、生成森林

如果一个有向图恰有一个顶点的入度为0,其余顶点的入度均为1,则是一棵有向树。

对有向树的理解比较容易,所谓入度为О其实就相当于树中的根结点,其余顶点入度为1就是说树的非根结点的双亲只有一个。一个有向图的生成森林由若干棵有向树组成,含有图中全部顶点,但只有足以构成若干棵不相交的有向树的弧。

如下图的图1是一棵有向图。去掉一些弧后,它可以分解为两棵有向树,如图2和图3,这两棵就是图1有向图的生成森林。

图节点回归问题 图的节点_无向图_13


总结


  • 按照有无方向分为无向图和有向图。无向图由顶点构成,有向图由顶点构成。弧有弧尾和弧头之分。
  • 图按照边或弧的多少分稀疏图稠密图。如果任意两个顶点之间都存在边叫完全图,有向的叫有向完全图。若无重复的边或顶点到自身的边则叫简单图。
  • 图中顶点之间有邻接点、依附的概念。无向图顶点的边数叫做,有向图顶点分为入度和出度
  • 图上的边或弧上带则称为
  • 图中顶点间存在路径,两顶点存在路径则说明是连通的,如果路径最终回到起始点则称为,当中不重复叫简单路径。若任意两顶点都是连通的,则图就
  • 连通图,有向则称强连通图。图中有子图,若子图极大连通则就是连通分量,有向的则称强连通分量
  • 无向图中连通且n个顶点n-1条边叫生成树。有向图中一顶点入度为0其余顶点入度为1的叫有向树。一个有向图由若干棵有向树构成生成森林


参考资料:
[1]程杰.大话数据结构[M].清华大学出版社:北京,2011.