一、什么是图:
一个图由结点和边组成,我们通常用 V V V表示点集,用 E E E表示边集。点的个数和边的个数通常用 ∣ V ∣ |V| ∣V∣和 ∣ E ∣ |E| ∣E∣。一般地,我们使用 ( V , E ) (V, E) (V,E)来表示一个图。
二、图的类型:
1、按边分:
图可以分为有向图和无向图,有向图的边是有方向的,只可从一侧走到另一侧,可理解为单行线。而无向图可以在所连接的两个节点中任意行走。
2、按找图的形状分:
按形状分时,图可以分为有环图和无环图。如果存在一个结点 u u u使得有一条路(不重复且沿路的方向)可以到达这个点,则这个图为有环图,反之,为无环图。
注:以上图分为有无权值(长度),没有权值的被称为无权图,有权值的被称为有权图。
三、图的储存:
1、邻接矩阵:
使用一个大小为
V
×
V
V\times V
V×V的数组(此处记为G),无权图使用0和1判断(亦可用布尔类型)。有权图存储权值即可,该数组
G
[
i
]
[
j
]
G[i][j]
G[i][j]表示
i
i
i到
j
j
j的边。无向图将
G
[
i
]
[
j
]
G[i][j]
G[i][j]与
G
[
j
]
[
i
]
G[j][i]
G[j][i]全部存储为相同值即可。
题目:使用邻接矩阵建一个点数为100的无向无权图,将点9与点11连接。
代码:
int udg[100][100];
udg[9][11] = udg[11][9] = 1;
2、邻接表:
使用一个大小为
V
V
V的数组(此处记为G),内装
V
V
V个
s
t
d
:
:
v
e
c
t
o
r
std::vector
std::vector。无权图使用0和1判断(亦可用布尔类型)。有权图存储权值即可,该数组
G
[
i
]
[
j
]
G[i][j]
G[i][j]表示
i
i
i到
j
j
j的边。无向图将
G
[
i
]
[
j
]
G[i][j]
G[i][j]与
G
[
j
]
[
i
]
G[j][i]
G[j][i]全部存储为相同值即可。
题目:使用邻接表建一个点数为100的有向无权图,添加一条由点9到点11的边。
代码:
vector <int> udg[100];
udg[9].push_back(11);