开始图论
我看的是这个
图论理论基础 | 图论 | 有向图 | 无向图 | 代码随想录-全网最全算法数据结构刷题学习路线|图文+视频教程|免费开源
因为我上学期学过图论所以大部分知识点看一下就可以回忆起来
你们直接看上面的链接就可以
深度优先搜索
概述
深度优先搜索是一种用于遍历或搜索树或图的算法。其核心思想是尽可能深地探索分支,直到无法继续为止,再回溯到上一个节点继续探索其他分支。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(图,选择的节点); // 递归
回溯,撤销处理结果
}
应用场景
- 路径查找:在迷宫或图中寻找从起点到终点的路径。
- 拓扑排序:对有向无环图(DAG)进行排序,常用于任务调度。
- 连通分量检测:判断图的连通性或强连通分量(结合反向图)。
- 回溯算法:如八皇后、数独等问题的解决。
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协议)。
- 连通性检测:判断图中节点是否连通或计算连通分量。