图基础
图的定义
图G 由顶点集V 和边集E 组成,记为G = (V,E),其中V(G)表示图G中顶点的有限非空集;E(G)表示图G中顶点之间的关系(边)集合。若V = {v1,v2,…,vn},则用|V| 表示图G中顶点的个数 ,也称为图G的阶 ,E = {{u,v} | u∈V,v∈V},用|E| 表示图G中边的条数 注意:线性表可以是空表,树可以是空树,但图不可以是空,即V一定是非空集 
无向图、有向图
若E是无向边 (简称边 )的有限集合时,则图G为无向图 。边是顶点的无序对,记为(v,w)或(w,v) ,因为(v,w)=(w,v) ,其中v、w是顶点。可以说顶点w和顶点v互为邻接点,边(v,w)依附于顶点w和v,或者说边(v,w)和顶点v、w相关联
若E是有向边 (也称弧 )的有限集合时,则图G为有向图 。弧是顶点的有序对,记为<v,w> ,其中v、w是顶点,v称为弧尾 ,w称为弧头 。<v,w>称为从顶点v到顶点w的弧,也称v邻接到w,或w邻接自v。<v,w> != <w,v>
简单图、多重图

顶点的度、入度、出度

顶点-顶点的关系描述

连通图、强连通图
 连通图最少有n-1条边是因为n个节点两两相连 非连通图最多有的情况是当其他n-1个节点两两相连,而最后一个节点一个都不连
子图
 生成子图是拥有原图所有点的子图
连通分量
用于描述无向图 
强连通分量
用于描述有向图 
生成树
n个顶点有n-1条边,再多就会形成回路 
生成森林

边的权、带权图/网

几种特殊形态的图

 
图的存储结构
- 邻接矩阵:数组实现的顺序存储,空间复杂度高O(n2),不适合存储稀疏图
- 邻接表:找有向图的入度不方便,删除顶点、删除边的时间复杂度高
- 十字链表:存储有向图
- 邻接多重表:存储无向图
邻接矩阵法
 
如何求顶点的度、入度、出度
 带权图: 
性能分析
 
邻接矩阵的性质
行*列 
邻接表
   
十字链表法
只能用于有向图 
性能分析

邻接多重表
只用于存储无向图 
总结

图的操作

判断图中是否有某条边
无向图:  有向图: 
列出图中与结点邻接的所有边
无向图:  有向图: 
在图中插入顶点

在图中删除顶点
无向图:  有向图: 
向图中添加一条边

求图中顶点x的第一个邻接点
无向图:  有向图: 
假设图中顶点x的一个邻接点y,返回除y之外顶点x 的下一个邻接点的顶点号,若y是x的最后一个邻接点,则返回-1
无向图: 
获取并设置图中边的权值

图的遍历
广度优先遍历

代码实现

遍历序列的可变性

算法改进
因为如果是非连通图,则无法遍历完所有结点 
复杂度分析

广度优先生成树

广度优先生成森林

练习

深度优先遍历

算法改进

复杂度分析
空间复杂度:  时间复杂度: 
深度优先生成树

深度优先生成森林

图的遍历和图的连通性
无向图:  有向图: 
总结

图的最小生成树(MST)
概念
 
Prim算法(普里姆)

Kruskal算法(克鲁斯卡尔)

两种算法对比

Prim算法的实现思想

Kruskal算法的实现思想
 
图的最短路径问题

BFS求无权图的单源最短路径
BFS实际上的结果就是单源最短路径 缺点:只能用于不带权的图
代码实现


Dijkstra(迪杰斯特拉)算法

步骤
如何使用数组信息

时间复杂度

对比Prim算法的实现思想

用于负权值带权图

Floyd算法
 
步骤
    


练习

不能解决的问题

总结

有向无环图描述表达式
    
拓扑排序
AOV网

概念
  
代码实现
  
逆拓扑排序
  
关键路径
AOE网
 
概念
 
  
求所有事件的最早发生时间

求所有事件的最迟发生时间

求所有活动的最早发生时间

求所有活动的最迟发生时间

求所有活动的时间余量

求得关键活动、关键路径

关键活动、关键路径的特性
 
|