1、图的定义和相关术语
图由顶点(Vertex)和边(Edge)组成,每条边的两端都必须是图的两个顶点。
一般来说,图可分为有向图和无向图。
顶点的度:和该顶点相连的边的条数,入边--入度,出边--出度
顶点和边都可以有一定属性,而量化的属性称为权值,点权、边权。
2、图的存储
图的存储有两种方式,邻接矩阵和邻接表
邻接矩阵:令二维数组G[N][N]的两维分别表示图的顶点标号。
如果不存在边权,G[i][j]=1表示顶点i、j之间有边,=0表示顶点i、j之间无边。
如果存在边权,则可以令G[i][j]存放边权。
邻接表:图中的每个顶点都有可能含有若干条出边,如果把同一个顶点的所有出边放在一个列表中,那么N个顶点就会有N个列表(没有出边,则对应空列表)。这N个列表被称为图的邻接表Adj[i]。(可以由链表实现)
3、图的遍历
图的遍历方法一般有两种:深度优先搜索(DFS)和广度优先搜索(BFS)
图的遍历(DFS)(伪代码)
## 访问顶点u
def DFS(u):
## 设置顶点u已被访问
vis=[True]
for (从u出发能达到的所有顶点v): ##枚举从u出发可以到达的所有顶点v
if vis[v]==False: ## 如果v从未被访问
DFS(v)
## 遍历图G
def DFSTrave(G):
for (G的所有顶点):
## 如果u从未被访问
if vis[u]==False:
## 访问u所在的连通块
DFS(u)
图的遍历(BFS)(伪代码)
## 遍历u所在的连通块
def BFS(u):
dq=deque()
## 将u入队
inq[u]=True
while (len(dq)!=0):
## 取出q的队首元素u进行访问
for (从u出发可达的所有顶点v):
if inq[v]==False:
## 将v入队
inq[v]=True
## 遍历图
def BFSTrave(G):
for (G的所有顶点u):
if inq[u]==False:
BFS(u)
4、最短路径
解决最短路径问题常用算法:Dijkstra、Bellman-Ford、SPFA、Floyd算法。
(下一篇)