一、图的简介
• 在计算机科学中,一个图就是一些顶点的集合,这些顶点通过一系列边结对(连接)。顶点用圆圈表示,边就是这些圆圈之间的连线。
• 顶点有时也被称为节点或者交点,边有时也称为链接。
• 边可以是单向的,也可以是双向的。
二、图的分类
-
无向图:
无向图是由顶点和边构成。 -
有向图:
有向图是由顶点和有向边构成。 -
完全图:
如果任意两个顶点之间都存在边叫完全图,有向的边叫有向完全图。如果无重复的边或者顶点到自身的边叫简单图。
三、图的表示
3.1 邻接矩阵
• 使用一个n×n的布尔值矩阵来表示任意两个节点之间是否有直接相连的边
• 对无向图来说,其邻接矩阵是一个对称矩阵
• 当图中边数E很稀疏时,邻接矩阵会浪费大量的空间
• 需要的空间为O(|V|2)
3.2 邻接表
• 存储每个节点出发边另一节点的下标
• 与邻接矩阵信息等价,存储空间更紧致
• 需要的空间为O(|V|+|E|)
四、图的遍历
4.1 广度优先搜索(Breadth-first Search, BFS)
queue = {start_node}, initialize visited to all False
visited[start_node] = True
while(!queue.empty()){
node = queue.front()
for neighbor_node in adj(node){ //遍历node的邻居
if(!visited[neighbor_node]){
visited[neighbor_node] = True
queue.push_back(neighbor_node)
//do something here
}
}
}
4.2 深度优先搜索(Depth-first Search, DFS)
visited[node] = True
for neighbor_node in adj(node){ //遍历node的邻居
if(!visited[neighbor_node]){
//do something here
DFS(neighbor_node)
}
}