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协议)。
  • 连通性检测:判断图中节点是否连通或计算连通分量。
相关推荐
sali-tec1 小时前
C# 基于OpenCv的视觉工作流-章69-圆弧测量
图像处理·人工智能·opencv·算法·计算机视觉
D_FW1 小时前
数据结构第八章:排序
数据结构
AI科技星1 小时前
圓 全域数学·72分册·哈希原本卷(七册分卷 · 72分册 · 习题与猜想版)
人工智能·算法·数学建模·数据挖掘·哈希算法·量子计算
sali-tec1 小时前
C# 基于OpenCv的视觉工作流-章70-轮廓点距
图像处理·人工智能·opencv·算法·计算机视觉
珂朵莉MM1 小时前
第七届全球校园人工智能算法精英大赛-算法巅峰赛产业命题赛第二赛季优化题--虚拟边算法
人工智能·算法
没文化的阿浩1 小时前
【数据结构】排序(4)——归并排序&计数排序
数据结构·算法·排序算法
88号技师1 小时前
2026年4月中科院一区SCI-灰叶猴优化算法Gray langurs optimizer-附Matlab免费代码
开发语言·算法·数学建模·matlab·优化算法
guygg881 小时前
MATLAB 进行长方形房间的混响仿真
开发语言·算法
悲伤小伞1 小时前
LeetCode 热题 100_5-11. 盛最多水的容器
算法·leetcode·职场和发展