图论总结

本文总结了图论中的关键算法,包括广度优先搜索、深度优先搜索、最小生成树(Prim算法和Kruskal算法)及最短路径算法等。通过对比不同算法的特点,帮助读者更好地理解和应用。

一、知识点整理

(一)图论的相关算法:
1.广度优先搜索:

用队列实现(广度优先搜索树不唯一)

从起点开始,标记已经访问过了;当队列非空的时候,就取首元素,然后元素出队,所有与该元素相邻且未被访问过的点入队列;标记入队的元素已经被访问过了。

2.深度优先搜索:

用栈实现,(递归实现)

将顶点入栈,如果有相邻的点,就将其入栈,直到没有相邻点就将其出栈,然后找在栈顶的元素其他的相邻点,如果没有则该点出栈直到栈空。

(二)最小生成树:(Prim算法,Kruskal算法)

Prim算法:

任选一个点,将这个点加入到一个集合当中,然后从不在该集合中的点中选一个点使得该点和任选的那个点之间的距离最短,然后将该点加入集合,该边为最小生成树的一条

边。(简单来说就是从一个顶点开始找最小边,并且使加入该边没有回路,直到所有顶点都用完)

Kruskal算法:

将边按权值从小到大排列后逐个判断,如果当前边加入后不会产生环,那么就把这条边当作最小生成树的一条边,最终得到的结果就是最小生成树。(留下所有顶点,将所有边

去掉,挨个加边,但是保证加入该边不会形成回路,直到加入(顶点-1)条边)

(三)最短路径:(单源最短路径、每对顶点的最短路径)

1.单源最短路径

Bell-Ford算法

spfa算法

dijskal算法

2.每对顶点的最短路径:
Floyd:每次以一个顶点为源点,调用Dijkstra算法n次。

二、感想

    专题四结束了,也就意味着ACM课结束了。一个学期就这么过去了,真快。图的相关知识已经在好几门课上学过了,学起来比较容易,但是算法做起来还不是特别容易,尤其最后这段时间专业课都结课考试,也静不下心来去作这些程序题,做的题量也不大,总之我觉着这个专题完成的不大好。

### 图论算法总结与例题 图论是一门研究图形结构及其性质的学科,在计算机科学中有广泛的应用。以下是几种常见的图论算法以及它们的相关例题。 #### 1. **广度优先搜索 (BFS)** 和 **深度优先搜索 (DFS)** 这两种基本的遍历方法可以用来解决许多基础问题,比如连通分量检测、路径寻找等。 - BFS通常适用于找到两点间的最短路径(无权图),其核心思想是以层次的方式扩展节点[^2]。 - DFS则常用于探索所有可能的状态或者回溯解决问题。 #### 2. **并查集** 并查集是一种处理动态集合的数据结构,主要用于快速判断两个元素是否属于同一个集合,并支持高效的合并操作。 - 并查集的主要功能包括查询和合并两部分。 #### 3. **最小生成树 (MST)** 最小生成树是指在一个加权连通图中找出一棵总权重最小的生成树。 - Prim算法通过不断选择离当前已构建的部分最近的顶点来逐步扩大这棵树[^1]。 - Kruscal算法则是按照边的权重从小到大依次考虑每条边,只要该边不会形成环就将其加入结果集中。 #### 4. **拓扑排序** 对于有向无环图(DAG),可以通过拓扑排序得到一个线性的顺序使得所有的前驱关系都满足。 - 方法通常是先统计入度再利用队列实现零入度节点移除的过程直到完成整个序列排列。 #### 5. **最短路径算法** 这些算法旨在计算从某个起点到达其他各点所需的最少成本。 - Dijkstra算法适合于非负权值的情况,它采用贪心策略每次挑选距离源点最近尚未访问过的节点作为新的候选者继续扩散影响范围[^3]。 - Bellman-Ford允许存在负权但需额外注意可能出现的负圈情况;SPFA是对前者的一种改进形式特别针对稀疏图表现更优[^4]。 - Floyd-Warshall能够一次性得出任意两点间最佳路线长度非常适合小型密集网络分析需求。 #### 实际应用举例 假设我们要设计一款游戏地图编辑器需要自动规划NPC巡逻线路,则可选用A*启发式寻径技术结合实际地形数据综合考量效率与合理性给出解决方案。 ```python import heapq def dijkstra(graph, start): distances = {node: float('infinity') for node in graph} distances[start] = 0 priority_queue = [(0, start)] while priority_queue: current_distance, current_node = heapq.heappop(priority_queue) if current_distance > distances[current_node]: continue for neighbor, weight in graph[current_node].items(): distance = current_distance + weight if distance < distances[neighbor]: distances[neighbor] = distance heapq.heappush(priority_queue, (distance, neighbor)) return distances ``` 以上代码片段展示了如何使用Python实现Dijkstra算法以求解给定图上某一点至其余各点之间的最短路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值