最后一个专题结束了,一学期的acm也终于终止了,这一期专题是我觉得最难的,因此没有做多少个,但是做的却认真看了。下面是对本专题的一些总结以及课上听讲笔记整理等:
图论总结:
图论总结:
图论的相关算法:
1.广度优先搜索:用队列实现(广度优先搜索树不唯一)
从起点开始,标记已经访问过了;
当队列非空的时候,就取首元素,然后元素出队,所有与该元素相邻且未被访问过的点入队列;
标记入队的元素已经被访问过了。
2.深度优先搜索:用栈实现,(递归实现)
将顶点入栈,如果有相邻的点,就将其入栈,直到没有相邻点就将其出栈,然后找在栈顶的元素其他的相邻点,如果没有则该点出栈直到栈空。
最小生成树:(Prim算法,Kruskal算法)
Prim算法:
任选一个点,将这个点加入到一个集合当中,然后从不在该集合中的点中选一个点使得该点和任选的那个点之间的距离最短,然后将该点加入集合,该边为最小生成树的一条边。(简单来说就是从一个顶点开始找最小边,并且使加入该边没有回路,直到所有顶点都用完)
Kruskal算法:
将边按权值从小到大排列后逐个判断,如果当前边加入后不会产生环,那么就把这条边当作最小生成树的一条边,最终得到的结果就是最小生成树。(留下所有顶点,将所有边去掉,挨个加边,但是保证加入该边不会形成回路,直到加入(顶点-1)条边)
最短路径:(单源最短路径、每对顶点的最短路径)
1.单源最短路径(Bell-Ford算法、spfa算法、dijskal算法)
dijskal算法:
设置一个集合s存放已经找到最短路径的顶点,其初始状态包含源点v,对vi∈V-S,假设从源点v到vi的有向边为最短路径。以后每求
的一条最短路径v, …, vk,就将vk加入集合S中,并将路径v, …,vk , vi与原来的假设相比较,取路径长度较小者为最短路径。重复上
过程,直到集合V中全部都加到集合S当中。
2.每对顶点的最短路径:
Floyd:
每次以一个顶点为源点,调用Dijkstra算法n次。