图的表达

邻接表表达方式

存储方式:有一张表,从第一行开始先存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:确定图上一个点是否在堆上