题目一
邻接表法:以点集为单位。记录每个节点的直接邻居,权值可直接记录下来
邻接矩阵:以边的角度
图的表达方式多种多样。
做题时,应该把其他表示图的方法转换自己的熟悉的方法。然后使用对应算法求解
图结构
如果图中的节点在解题过程中,只用到了数字,如0-1000号城市,可以采用数组结构代替hash结构。虽然查找都是O(1)的。但是数组常数时间更短
图节点的构造
in out 为入度和出度
nexts是存放的图节点发散出去的邻居节点
edges是存放的图节点发散出去的边
边的描述
根据图的描述创建图
题目二 图的遍历
图的遍历和二叉树不同的地方就是图会有环
宽度优先遍历
如果是按照宽度优先遍历处理什么。就把打印操作换成处理操作
set为检查是否遍历过的机制
深度优先遍历
处理数据是在压栈的时候处理
碰到没走过的一条路走到底
题目三
给一个依赖环境,确定包导入的顺序 来完成整个环境的导入(
拓扑排序:把入度为0的节点找出,然后擦掉,继续寻找入度为0的节点
题目四 生成最小生成树
最小生成树:把图转化为树,要保证所有点都联通,且权值总和最小
k算法:先把所有的边的权重都排个序。从最小的边开始加节点。如果形成环则不要。
最开始每一个节点自己都是一个集合,每次看两个节点之间是否属于同一个集合。如果不属于就合并为一个集合。属于则不要
以下为该功能的简单实现,并没有使用并查集。使用并查集合并的操作是常数级别的
以下算法实现是并查集的实现。unionFind就是我们创建的类MySets。其中通过比较器来实现对边的排序
首先确定一个初始节点,把权值最小的边连接的节点放入集合,然后再从新解锁的边和之前的边中选一个最小的边的节点放入集合,如果有就找次小的边所连的节点
单元最短路径算法:确定一个初始点。结果输出初始点到每个节点最短的距离是多少