用邻接表表示的无向图

图的遍历算法

深度优先算法(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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值