图
图的表达
邻接表表达方式
存储方式:有一张表,从第一行开始先存A的直接邻居(C,D)第二行存B的直接邻居,依次存玩每个点(存放有权值的图,只需在表中对应位置加个数据项用来存放权值即可)
邻接矩阵表达方法:
一个二维数组每一行代表每一个点,每一列也代表每一个点,根据图将点到点之间的距离存入对应位置,无法到达存无穷
使用点集和边集表达图
nodes:表示点集。edges:表示边集
in:表示入度。on:表示出度。next:表示从该点出发所指向的点。edges:表示属于该点的边
weight:表示权重。from:表示从哪个点出发。to:表示指向哪个点
入度:代表有多少个边指向这个点
出度:代表这个点指向多少个点
无向图的出度和入度想等
图的表达方式的转化(将给定的表达方式转换成熟悉的表达方式)
例如给定以上图所示的表达方式每行表示权值,起始点,终点
代码所示的每行为起始点,终点,权值
宽度优先遍历:
从A开始先存入队列和set中(set用于存放被处理过的点,防止无限循环)1)若队列不为空从中弹出一个数并做相应处理,2)遍历弹出的点的直接邻居若不在set中存入队列和set重复1)2)操作
深度优先遍历:
拓扑排序算法
适用范围:要求有向图,且有入度为0的节点,且没有环
对于一个无环的有向图,一次找出入度为0的点输出(处理)并消除其影响(即消除以该点为起始点的线)
生成最小生成树:
保证每个点都能到达且权重和为最小,则为最小生成树
kruskal算法
适用范围:要求无向图
从权重最小的边开始往上加,若形成环则去掉,否则不去,依次遍历每一个边
将每个点分别存放到一个集合里,1)从权重最小的边开始添加,2)若该边连接的两个点不在一个集合里,将这两个集合合并,3)若在同一个集合里则去除该边,重复1)2)3)直至遍历完每个边
其中UnionFind为并查集,可用上图写的MySets代替(但是时间复杂度会提高)
PriorityQueue:为自己定义的比较器让边从权重最小存放
prim算法
适用范围:要求无向图
for循环是为了解决森林问题
单元最短路径算法
Dijkstra算法
使用范围:不能有累加和为负数的环,可以有权值为负数的边
创建一个初始的表,用于存放A点到各个点的最短距离(初始到自己为0,其余点系统最大值)1)选中表中距离A最短的那个点,2)查看该点出发的边所到大的点的距离是否比表中所记录的短,短就记录,3)标记此点在未标记的点中再选出最短距离重复2)操作
使用堆优化Dijikstra算法
第一次选a点进行比较更改之后,将更改的直存到小根堆(自己创建,不适用系统给定的)中,直接弹出堆顶,在进行检查路径和表中的值做对比更改,并且更改堆中对应的值,之后重复
NodeRecord结构
heapIndexMap:存放图上的点在堆上的位置
内部函数:
isEntered:确定图上一个点是否进过堆
inHeap:确定图上一个点是否在堆上