概念:一种数据结构,G=(V, E),其中是顶点集合,是关系(顶点之间的边)集合
类别:(不)带权图、(无)有向图、子图、(稀疏)稠密图、简单图、完全图、(无)有环图、(非)[强]连通图、生成树
相关:顶点、边、度、权、路径
图的抽象数据类型定义(C++):
1. template<class EdgeType>
2. class Edge{
3. public:
4. int start, end;
5. EdgeType weight;
6. Edge();
7. Edge(int s, int e, int w);
8. bool operator >(Edge<EdgeType> oneEdge);
9. bool operator <(Edge<EDgeType> oneEdge);
10. };
11. template<class EdgeType>
12. class Graph{
13. public:
14. Graph(int verticesNum);
15. ~Graph();
16.
17. virtual EdgeType FirstEdge(int oneVertex)=0;
18. //返回与顶点oneVertex相关联的第一条边
19. virtual EdgeType NextEdge(Edge<EdgeType> oneEdge)=0;
20. //返回与边oneEdge有相同起点的下一条边
21. virtual void setEdge(int start, int end, int weight)=0;
22. //设置边(start, end),权重为weight
23. virtual void delEdge(int start, int end)=0;
24. //删除边(start, end)
25.
26. int VerticesNum(); //返回图的顶点个数
27. int EdgesNum(); //返回图的边数
28.
29. bool IsEdge(Edge<EdgeType> oneEdge);
30. //如果oneEdge是边则返回TRUE,否则返回FALSE
31. int StartVertex(Edge<EdgeType> oneEdge);
32. //返回边oneEdge的起点
33. int EndVertex(Edge<EdgeType> oneEdge);
34. //返回边oneEdge的终点
35. EdgeType Weight(Edge<EdgeType> oneEdge);
36. //返回边oneEdge的权
37.
38. };
图的存储
• 邻接矩阵(存储大小只与顶点数目有关,适用于稠密图)
• (逆)邻接表(存储大小与顶点数和边数目有关,适用于稀疏图,分头节点[顺序存储]和边节点[链式存储])
• 十字链表(邻接表+逆邻接表)—有向图
• 邻接多重表(十字链表+标志域)—无向图
图的遍历
• 深度优先搜索(DFS,用栈,先从上往下,再从左往右)
• 广度优先搜索(BFS,用队列,先从左往右,再从上往下)
最小生成树(不唯一)
• Prim(找点)
○ U:生成树顶点集合
○ TE:生成树边集合
○ neighbor[j]:生成树中离顶点j最近的顶点编号(等于-1表示为生成树顶点)
○ nearest[j]:neighbor[j]与顶点j的距离
• Kruskal(找边)
○ 等价类[find, union]
○ 最小堆
最短路径(不唯一)
• Dijkstra(单源最短,前提是权重非负,贪婪找点)
○ S:最短路径已确定的顶点集合
○ V-S:其余顶点
○ D:最短特殊路径长度(从源点到顶点的路径只经过S中的顶点)
○ Path:前驱顶点
• Floyd(动态规划,迭代n次)
○ adj:顶点之间最短路径长度(初始化为邻接矩阵)
○ path:前驱顶点
拓扑排序(不唯一,判断有向图是否存在环[无向图由深度优先搜索可以判断])
• 删除入度为零的顶点及其出边
• 更新
关键路径
• 源点+拓扑序列–>确定事件最早发生时间ve(保证所有前置活动已完成)
• 汇点+逆拓扑序列–>确定事件最晚发生时间vl(保证所有后置活动不耽误)
• 根据ve和vl,确定活动最早开始时间e和最晚开始时间l
• e=l,关键活动,关键路径