图的基础复习
acm图论较一般图论的问题:必须对图的结点和边进行输入读取,还要正确区分题设要求和返回值
图的存储结构:
邻接表和邻接矩阵。 输入值通常包括结点数量N,边数量M。对邻接矩阵进行空间申请时,建议申请N+1规模
1.深度优先搜索。 基本思路:采用递归栈的思想,不断入栈弹出回溯,对图进行遍历 代码结构: 1.根据题设设计传参和返回值 2.设计递归终止条件 3.设计单层递归逻辑
2.广度优先搜索。 基本思路:采用队列的FIFO的思想,对遍历的结点依次入队,当该结点所有邻居入队之后,将该结点出队 代码结构: 1.设计队列,并将初始访问结点入队初始化,为了防止出现孤立结点,必须对所有结点进行遍历 2.设计入队出队逻辑。 3.增设题设要求 4.模拟出队入队逻辑
代码随想录的广度搜索存在假设的方向选择,这是存在有特异化方向的具体四格地图问题,并不是广义的广度搜索。单层出入队逻辑应当为为充分遍历该结点所有邻居,可以根据具体题设设置函数。课程中设置的地图只是用来便于理解和方便快速查找邻居。
常见问题: 1.存在路径问题:指定两结点,判断两结点之间是否存在路径。并查集适合用来快速判断两结点之间是否存在路径。深度搜索适合用来寻找可达路径以及所有可达路径。广度搜索同深度搜索,但是在搜索中自带最短路径。
2.孤岛问题:广度搜索和深度搜索的都可以快速完成,具体问题解决时要将标记法和hash法熟练运用。
并查集
用于快速确定两结点之间的关系,判断是否在同一集合内
具体思路:通过将所有结点的父结点确定为同一结点来进行快速查找。 初始化:所有结点设置父节点为自身 并集:将小集合的父结点并为大集合的子结点,即大集合的父结点成为小集合的父结点 查找:执行路径压缩,在查找父结点的过程中,不断递归压缩子结点和父节点之间的间距,实现一次查找,该路径所有子结点与父结点间距为1 判断是否同一集合:调用查找来判断父结点是否相同
注意:在图论中,并查集的重要作用是用来快速判断结点间是否联通,新入结点和边是否成环