图论
图的连通性
生成树
最小生成树
prime算法
把所有的点分成两类,一类是已到达的,一类是未到达的。初始化,源点为已到达点,其它均为不可到达点。然后从已到达点堆 到 不可到达点堆的 所有边中挑出代价最小的一条边加入生成树中,再将连接的这个点加入已到达点堆,依次迭代,直到所有点都可到达。
时间复杂度:O(n^2)
kruskal算法
把所有边排序,依次取最小的边,如果不构成环则把它加入生成树中。(利用并查集)
时间复杂度:O(n^2)
拓扑排序
由某个集合上的一个偏序得到该集合上的一个全序,这个操作称为拓扑排序。
算法如下:
1. 在有向图中选一个没有前驱的顶点且输出之(如果有多个,则任意输出一个)
2. 从图中删除该顶点和所有已它为尾的弧(入度为0的结点)
3. 重复上面两个步骤,直到全部顶点都输出
最短路径
Dijkstra算法
分集合,确定最优解。然后延伸,比如上一步已经将Vk加入S集合,则下一步考虑Vk所能到达的点,并与集合中结点到下一个j的距离比较。如果小,则更新。并加入到S集合。
最短路径的最优子结构性质
该性质描述为:如果P(i,j)={Vi….Vk..Vs…Vj}是从顶点i到j的最短路径,k和s是这条路径上的一个中间顶点,那么P(k,s)必定是从k到s的最短路径。下面证明该性质的正确性。假设P(i,j)={Vi….Vk..Vs…Vj}是从顶点i到j的最短路径,则有P(i,j)=P(i,k)+P(k,s)+P(s,j)。而P(k,s)不是从k到s的最短距离,那么必定存在另一条从k到s的最短路径P’(k,s),那么P’(i,j)=P(i,k)+P’(k,s)+P(s,j)
Floyod算法
算法过程:
1、用D[v][w]记录每一对顶点的最短距离。
2、依次扫描每一个点u,并以其为基点再遍历所有每一对顶点D[v][w]的值,看看是否可用过该基点让这对顶点间的距离更小。