图的操作
最重要的两个:
- FirstNeighbor(G,x):获取到该结点第一个领接点。
- NextNeighbor(G,x, y):返回领接点的下一个。
广度优先遍历
类似树的广度优先一层一层,图的广度优先,第一个走一步到达地方,走两步到达地方。算法思想就是在上一步到达的点,再走一步走向领接点遍历。依旧使用队列实现
图选定一个结点能够生成广度优先生成树或者森林。
与树遍历不同点:
- 树往下走一定是没有访问过的结点,图不一定,需要设定记录数组,记录访问过的点。
- 图有可能是非连通图,所以需要在原有代码基础上遍历一遍结点,查看每一个结点是否都遍历过。
深度优先
与树深度优先类似,有深度优先生成树或森林。可以递归可以用栈,不同点与广度优先相同。
最小生成树
prim算法
最小生成树:带权图的生成树重路径权重总和最小。
prim算法构造最小生成树,主要出发点是结点。算法过程:
- 设立一个集合,设为空,随便选一个点加入集合
- 遍历其他点,查看哪一个结点到达该集合花费最小,也就是到达集合随便一个点就行。
- 选取花费最小结点加入集合。循环直到所有结点加入集合。
时间复杂度:O(|V|^2).
代码过程:
- 开两个数组,一个是否选择,一个最低花费数组
- 随便选一个点加入,修改选择数组
- 然后在其余没有被选择的点里面根据最低花费数组选择点加入
- 根据加入点更新选择数组与最低花费数组
- 循环2直至所有点结束
Kruskal算法
Kruskal出发点主要是边,每一次选取某一端结点未被选定的最小边。
算法过程:
- 设立结点集合,初始化为空
- 选择一条有某一端不在集合的最小边
- 循环直到所有点进入集合
时间复杂度O(|E|log|E|)。log|E|是边的两端结点进行并查集查操作所花费的。