day43-数据结构力扣

开始图论

我看的是这个

图论理论基础 | 图论 | 有向图 | 无向图 | 代码随想录-全网最全算法数据结构刷题学习路线|图文+视频教程|免费开源

因为我上学期学过图论所以大部分知识点看一下就可以回忆起来

你们直接看上面的链接就可以

深度优先搜索

概述

深度优先搜索是一种用于遍历或搜索树或图的算法。其核心思想是尽可能深地探索分支,直到无法继续为止,再回溯到上一个节点继续探索其他分支。DFS通常通过递归或栈结构实现,适用于路径查找、拓扑排序、连通性分析等问题。

实现方式

递归实现

递归是DFS最直观的实现方式,代码简洁但可能受限于栈空间:

python 复制代码
def dfs_recursive(graph, node, visited=None):
    if visited is None:
        visited = set()
    visited.add(node)
    print(node)  # 处理节点
    for neighbor in graph[node]:
        if neighbor not in visited:
            dfs_recursive(graph, neighbor, visited)

三部曲:

1.确认递归函数参数

python 复制代码
void dfs(参数)

2.确认终止条件

python 复制代码
if (终止条件) {
    存放结果;
    return;
}

3.处理当前节点出发的路径

python 复制代码
for (选择:本节点所连接的其他节点) {
    处理节点;
    dfs(图,选择的节点); // 递归
    回溯,撤销处理结果
}

应用场景

  1. 路径查找:在迷宫或图中寻找从起点到终点的路径。
  2. 拓扑排序:对有向无环图(DAG)进行排序,常用于任务调度。
  3. 连通分量检测:判断图的连通性或强连通分量(结合反向图)。
  4. 回溯算法:如八皇后、数独等问题的解决。

98. 所有可达路径

题目链接98. 可达路径

思路

步骤 对应内容
1. 确认递归函数参数 def dfs(cur)cur 是当前访问的节点
2. 确认终止条件 if cur == n:到达终点,保存当前路径
3. 处理当前节点出发的路径 遍历当前节点的所有邻居,递归 + 回溯

感觉输入没写过一点都不知道怎么写,后面也是,没思路

提交

python 复制代码
def main():
    import sys
    sys.setrecursionlimit(10000)
    # 读入图
    N, M = map(int, sys.stdin.readline().split())
    adj = [[] for _ in range(N + 1)]
    for _ in range(M):
        s, t = map(int, sys.stdin.readline().split())
        adj[s].append(t)

    paths = []   # 存所有路径
    path = []    # 当前路径(回溯用)

    # 1. 确认递归函数参数:当前节点 cur
    def dfs(cur):
        # 先把当前节点加入路径
        path.append(cur)

        # 2. 确认终止条件:到达终点 N
        if cur == N:
            paths.append(path.copy())  # 保存当前路径
            path.pop()                 # 回溯:恢复状态
            return

        # 3. 处理当前节点出发的路径:遍历所有邻居
        for next_node in adj[cur]:
            dfs(next_node)   # 递归访问下一个节点

        # 回溯:撤销处理结果(当前节点出栈)
        path.pop()

    # 从起点 1 开始 DFS
    dfs(1)

    # 输出
    if not paths:
        print(-1)
    else:
        for p in paths:
            print(" ".join(map(str, p)))

if __name__ == "__main__":
    main()

广度优先搜索

概述

广度优先搜索(Breadth-First Search, BFS)是一种用于遍历或搜索树或图的算法。其核心思想是从起始节点开始,逐层访问相邻节点,确保先访问所有相邻节点后再深入下一层。BFS通常用于寻找最短路径或解决与层级相关的问题。

实现方式

递归实现

BFS通常以迭代方式实现,但可通过模拟队列的递归方式实现(不常见且效率较低)。递归实现需结合队列数据结构:

python 复制代码
from collections import deque

def bfs_recursive(queue, visited, graph):
    if not queue:
        return
    node = queue.popleft()
    print(node)  # 处理节点
    for neighbor in graph[node]:
        if neighbor not in visited:
            visited.add(neighbor)
            queue.append(neighbor)
    bfs_recursive(queue, visited, graph)

# 调用示例
graph = {'A': ['B', 'C'], 'B': ['D'], 'C': [], 'D': []}
visited = set(['A'])
queue = deque(['A'])
bfs_recursive(queue, visited, graph)

应用场景

  • 最短路径问题:在无权图中寻找两点间最短路径(如迷宫求解)。
  • 社交网络分析:查找用户之间的最短关系链。
  • 网络爬虫:按层级抓取网页,避免深度优先导致的重复访问。
  • 广播机制:消息在网络中按层级扩散(如Gossip协议)。
  • 连通性检测:判断图中节点是否连通或计算连通分量。
相关推荐
JieE2123 小时前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法
JieE2121 天前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack201 天前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树1 天前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色
JieE2122 天前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法
JieE2122 天前
LeetCode 104. 二叉树的最大深度|递归思路超详细拆解
javascript·算法
vivo互联网技术2 天前
CVPR 2026 | 全新强化学习框架 BeautyGRPO:重塑真实人像
算法·大模型·cvpr·影像
Darling噜啦啦2 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
用户497863050732 天前
(一)小红的数组操作
算法·编程语言