图论 最短路,最小生成树

深度优先搜索&广度优先搜索
1. 深搜
a) 随便走,走到无路可走,再后退,退到有路可走
2. 广搜
a)
3. 最短路问题
a) 单源最短路:求一个点到其余所有点的最短路。
i. 算法:
1. dijkstra
a) 条件:这张图中所有边的长度都>=0;
b)
i. 第15-19行太慢,时间复杂度为(n*n+m),所以用小根堆进行优化:
2. bellman-ford
a) 时间复杂度为:点数×边数,只试用于范围较小的。
3. spfa:当既有大数据也有负权边的时候,只能用spfa。(理论上时间复杂度为O(mn)与bellman-ford一样,但实际上一般不同,而bellman-ford一定是O(mn))。

b) 多源最短路:求所有点到其余所有点的最短路。
i. 算法:弗洛伊德:
ii. 如果两个点之间没有最短路,那么认为最短路为无穷大。(memset(a,0x3f,sizeof(a)));
iii.
iv.
1. a为中间点,b为起点,c为终点。(顺序不能变,必须先枚举中间点,再枚举起点,最后枚举终点)
4. 最小生成树
a) 生成树:要从一个图中找到一些边,使得这些边和全部点能够组成一棵树。
b) 最小生成树:把能组成这棵树的边的长度加起来,最小的那棵树被称为最小生成树。
c) 算法
i. Prim算法:一般默认1为根,把1放进树,用1去更新其他点到这棵树的距离。(点与树的距离只用算一条边的距离,不需要算到1的距离,也就是不需要算最短路而已)。
ii. Kruscal算法(本质:贪心):
1. 把所有边按从小到大排序,然后判断加一条边后会不会出现环,如果不出现,就可以加进去
iii. 数据结构:
1. 并查集
a) 路径压缩:

1. 拓扑排序:把有向无环图转化成一个序列。
a)
i. 没有点指向1和4,所以把1和4放前面,也就是先找入度为0的点。
ii. 把入度为0的点放入序列中,然后删掉,再继续找新的入度为0的点。
2. 二分图匹配
a) 要找到一组匹配数最多的匹配

转载于:https://www.cnblogs.com/liumengliang/p/11189958.html

你可能感兴趣的:(数据结构与算法,大数据)