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协议)。
  • 连通性检测:判断图中节点是否连通或计算连通分量。
相关推荐
hetao17338374 小时前
2026-10-03~04 hetao1733837 的刷题记录
c++·算法
Zootopia6265 小时前
飞行力学知识梳理1|飞行性能与稳定性
人工智能·python·算法·机器学习·无人机·学习方法·信息与通信
longlongzihan5 小时前
从LeetCode 70. 爬楼梯看动态规划:如何精准推导状态转移方程?
c++·算法·leetcode·动态规划
2601_960356386 小时前
2027校招采购岗解析:数学基础如何迁移到需求预测、成本与供应商分析
人工智能·算法
h_a_o777oah7 小时前
【树论】树链剖分:将树形结构转化为线性结构以处理树上路径问题(洛谷 P3384 附C++代码模板)
数据结构·算法·线段树·acm·树链剖分·树论·重链剖分
HEJOO97 小时前
指针的算术运算详解
java·数据结构·算法
Coder-magician7 小时前
《代码随想录》刷题打卡day47:并查集-part01
数据结构·算法·图论
垆边人似月.7 小时前
VLAN 资源池(100~200 分档)
数据结构·算法
潼心1412o8 小时前
C++初阶(长期更新)第6讲:类和对象(下)
开发语言·c++·算法
星光开发者8 小时前
基于决策树随机森林算法的小说推荐系统的设计与实现-计算机毕设【课程设计】78485
vue.js·算法·微信小程序·django·php·课程设计·express