图的遍历算法
深度优先算法(DFS)
即类似于二叉树的前序遍历,不同点在于由于图的关系是一对多的,因此需要一个visit[vertexNum]数组用来表示该点是否被遍历过
核心在于1.需要向迭代函数DFS(int)传入所有的未被遍历到的顶点(因为图有可能是非连通图,连通图仅传入一个即可),而在二叉树中只需要传入头指针指向的顶点即可,2.在迭代函数中需要将其所有未被遍历过的邻接顶点传入迭代函数,而在二叉树中只需要传入其左右孩子节点即可
广度优先算法(BFS)
即类似于二叉树的层序遍历,其核心点和深度优先算法一致!
最小生成树算法
Prim 算法
Prim 算法本质:从一个节点开始,逐步找每个节点的权值最小的边
Prim算法需要两个数组:
-
lowcost[vertexNum]的值用来指示每一轮循环的权值,其中当值为0时说明该索引对应的节点已经在最小生成树中,下次跳过
-
adjvex[vertexNum]的值用来指示每一轮循环对应的索引处节点的前缀
Kruskal算法
Kruskal算法本质:将各边的权值按从小到大排列,从最小的权值的边开始遍历,分别判断每条边即对应的两个顶点是否在若干个最小生成树中,从而判断选取该边还是跳过该边继续遍历
Kruskal算法需要一个数组:
-
parent[vertexNum]的值用来表示整个连通图的各个最小生成树集合,每次即通过函数检测两个节点是否在其中的一个集合内!
最短路径算法
Dijkstra算法
核心:依次寻找源点到连通图中每一个顶点的最短路径
Dijkstra算法需要三个数组:
-
shortPaths[vertexNum]的值用来指示源点V0到其余顶点的最短路径值
-
nodes[vertexNum]的值用来指示每一个顶点V的最短路径中的前缀顶点
-
final[vertexNum]的值表示V0到该点的最短路径是否寻找到,1为寻找到
整个代码如下:
#include<iostream> #include<vector> #include<queue> #include<algorithm> #include<fstream> #include<stack> using namespace std; struct Edge { Edge(int b,int e,int w):begin(b),end(e),weight(w){} int begin; int end; int weight; }; struct EdgeNode { EdgeNode(int AdjPos,int Weight):adjPos(AdjPos),weight(Weight),next(nullptr){} EdgeNode():adjPos(0),weight(0),next(nullptr){} int adjPos; int weight; EdgeNode *next; }; struct