最小生成树
在连通的带权图的所有生成树种, 权值和最小的那棵生成树,称作为最小生成树。普里姆(Prim)算法和克鲁斯卡(Kruskal)算法
1. Prim
一个图中, 有N个点, 我们记做集合A, 这时候我们选一个点开始, 这个点a放到集合B中。
第一轮:与这个a点相连的所有点, 选择一个权值最小的点b,放入到B中,
第二轮:选择与a或b相连的所有点(不包含a和b的连线),再选择一个权值最小的点c,放入到集合B中
第三轮:选择与a或b或c相连的所有点(不包含a b c之间互相连接的线), 选择一个权值最小的点d,放入到集合B中
第N轮: 选择与B集合中的点相连接的所有点(不包含集合B中互相连接的点), 选择一个权值最小的点n, 放入到集合B中
最终, 当着N个点,都划入到B中,结束。这个点的顺序和权值的关系,就是最小生成树
2. Kruskal
原理和prim有点像, 不过prim注重的是对点的处理, Kruskal注重的是对边的处理。
最短路径:
1.Dijkstra
一共N个点记做集合A, 我们从点a出发到点z, 选择里a最近的点b放到集合A中
集合是a->b 在找距离b最近的点c, 把c放到集合A中, 集合A中判断,a->c是否大于a->b->c,如果大于路径为a->c否则为a->b->c
继续查找距离c最近的点d, 把d放入到集合a中, 在集合A中找到a->d最短的距离,
反复查找,直到所有的N个点都在集合A中的时候, 算出的路径就是最短路径
2.Folyd
N个点记做集合A,做一个二维数组, 数组的每个元素A[i][j]记录i点到j点的距离。
求a 到b的距离, A[a][b] = 距离D
在加一个点x A[a][x] + A[x][b] 最小 = 距离D1
依次多加一个点, 找出做小的距离Dn, 那个组合的点顺序就是 最短路径。