图论基本概念
图论是研究图(由节点和边组成的结构)的数学分支,广泛应用于计算机科学、网络分析等领域。
-
图的类型:
- 无向图:边无方向,如社交网络中的好友关系。
- 有向图:边有方向,如网页链接关系。
- 加权图:边带权值,如地图中的路径距离。
- 稀疏图/稠密图:根据边数与节点数的比例划分。
-
常见术语:
- 度:节点的边数(有向图分为入度和出度)。
- 路径:节点序列,相邻节点间有边连接。
- 连通性:无向图中任意两节点间存在路径则为连通图。
图论算法与Python实现
图的表示方法
-
邻接矩阵 :适合稠密图,空间复杂度 O(V\^2)。
python# 无向图邻接矩阵示例 graph = [ [0, 1, 1], [1, 0, 0], [1, 0, 0] ] -
邻接表 :适合稀疏图,空间复杂度 O(V+E)。
pythongraph = { 'A': ['B', 'C'], 'B': ['A'], 'C': ['A'] }
关键算法
-
广度优先搜索(BFS):用于最短路径(无权图)。
pythonfrom collections import deque def bfs(graph, start): visited = set() queue = deque([start]) while queue: node = queue.popleft() if node not in visited: print(node) visited.add(node) queue.extend(graph[node]) -
深度优先搜索(DFS):用于拓扑排序、连通分量。
pythondef dfs(graph, node, visited=None): if visited is None: visited = set() if node not in visited: print(node) visited.add(node) for neighbor in graph[node]: dfs(graph, neighbor, visited) -
Dijkstra算法:单源最短路径(带权图,无负权)。
pythonimport heapq def dijkstra(graph, start): distances = {node: float('inf') for node in graph} distances[start] = 0 heap = [(0, start)] while heap: current_dist, node = heapq.heappop(heap) for neighbor, weight in graph[node].items(): distance = current_dist + weight if distance < distances[neighbor]: distances[neighbor] = distance heapq.heappush(heap, (distance, neighbor)) return distances
考试常见考点
- 基础概念:图的分类、度、路径、连通性判断。
- 图的遍历:BFS/DFS的实现与应用(如迷宫问题)。
- 最短路径:Dijkstra、Floyd-Warshall算法的原理与实现。
- 最小生成树:Kruskal和Prim算法的比较与代码实现。
- 拓扑排序:针对有向无环图(DAG)的排序方法。
- 图的连通性:强连通分量(Kosaraju算法)、割点与桥。
复习建议
- 理论结合实践:通过Python实现经典算法(如NetworkX库辅助学习)。
- 刷题巩固:LeetCode或《算法导论》中的图论题目(如"课程表"、"岛屿数量")。
- 复杂度分析:掌握各算法的时间/空间复杂度(如Dijkstra为 O((V+E)\\log V))。