六度分割理论(小世界理论,六度空间理论):你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个中间人你就能够认识任何一个陌生人。
从陈家庄到张家村,怎么走最快呢?怎么修公路使得村村通的花费最少呢?
以上例子都是图在实际中的应用。
1 图的定义与术语
一种“多对多”的关系。
采用G= (V,E) 表示
—— V 是顶点 (vertex) 集合
—— E 是边 (edge) 的集合
1.1 无向图
1.2 有向图(directed graph)
1.3 标号图(labeled graph)
1.4 带权图(weighted graph)
1.5 顶点的度
1.6 子图
1.7 回路 (cycle,也称为环)
回路:起点等于终点的路径
1.8 有根图(树,森林)
1.9 连通图
图中任意两顶点均连通
对无向图 G= (V,E) 而言,如果从 V1 到 V2 有一条路径 (从 V2 到 V1 也一定有一条路径) ,则称 V1 和V2 是连通的 (connected)
2.0 无向图连通分支(连通分量)
2.1 其他
2.2 网络(Activity On Vertex,AOV)
2 图的存储结构
2.1 相邻矩阵(adjacency matrix,或邻接矩阵)
(1)有向图的相邻矩阵
(2)无向图的相邻矩阵
对于无向图的存储,可以省一半空间
2.2 邻接表( adjacency list )
(1)无向图的邻接表表示
无向图同一条边在邻接表中出现两次
(2)带权图的邻接表表示
(3)有向图的邻接表(出边表)
(4)有向图的逆邻接表(入边表)
2.3 十字链表 (Orthogonal List)
十字链表 (Orthogonal List) 可以看成是邻接表和逆邻接表的结合
3 图的遍历(graph traversal)
给出一个图G和其中任意一个顶点V0,从V0出发系统地访问G中所有的顶点,每个顶点访问而且只访问一次
会遇到的问题:
(1)从一顶点出发,可能不能到达所有其它的顶点
如:非连通图
(2)也有可能会陷入死循环
如:存在回路的图
解决办法:
(1)为每个顶点保留一个 标志位 (mark bit)
(2)算法开始时,所有顶点的标志位置零
(3)在遍历的过程中,当某个顶点被访问时,其标志位就被标记为已访问
3.1 深度优先遍历(depth-first search,DFS)
类似于树的先序遍历
3.2 广度优先遍历(breadth-first search,BFS)
类似于树的层序遍历
3.3 拓扑排序(topological sort)
如果图中从V到W有一条有向路径,则V一定排在W之前。满足此条件的顶点序列称为一个拓扑序列
获得一个拓扑序的过程就是拓扑排序
AOV如果有合理的拓扑序,则必定是有向无环图(Directed Acyclic Graph, DAG)
网络(AOV)为带权的连通图
4 最短路径
4.1 单源最短路径(single-source shortest paths)
从某固定源点出发,求其到所有其他顶点的最短路径。‘
4.1.1 无权图的单源最短路算法
按照递增(非递减)的顺序找出到各个顶点的最短路
4.1.2 有权图的单源最短路算法
按照递增的顺序找出到各个顶点的最短路
4.2 每对结点间的最短路径
求任意两顶点间的最短路径
5 最小生成树(minimum-cost spanning tree, MST)
5.1 贪心算法
5.2 Prim 算法
5.3 Kruskal 算法
(1)
(2)
(3)
(4)
攻略结束,各位可以开始上吊了。
本文参考自:
张铭《数据结构与算法》
陈越,何钦铭《数据结构》
程杰《大话数据结构》