数据结构与算法--图

概念:一种数据结构,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的距离
Prim
• Kruskal(找边)
○ 等价类[find, union]
○ 最小堆
Kruskal

最短路径(不唯一)
• Dijkstra(单源最短,前提是权重非负,贪婪找点)
○ S:最短路径已确定的顶点集合
○ V-S:其余顶点
○ D:最短特殊路径长度(从源点到顶点的路径只经过S中的顶点)
○ Path:前驱顶点
Dijkstra
• Floyd(动态规划,迭代n次)
○ adj:顶点之间最短路径长度(初始化为邻接矩阵)
○ path:前驱顶点
Floyd

拓扑排序(不唯一,判断有向图是否存在环[无向图由深度优先搜索可以判断])
• 删除入度为零的顶点及其出边
• 更新

关键路径
• 源点+拓扑序列–>确定事件最早发生时间ve(保证所有前置活动已完成)
• 汇点+逆拓扑序列–>确定事件最晚发生时间vl(保证所有后置活动不耽误)
• 根据ve和vl,确定活动最早开始时间e和最晚开始时间l
• e=l,关键活动,关键路径
关键路径

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值