用邻接表表示的无向图

图的遍历算法

深度优先算法(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
    评论
实现无向图的基本思路是使用邻接表来存储每个顶点的邻居节点。邻接表是指一个数组,每个数组元素对应一个顶点,数组元素的值是一个链表,链表中存储了与该顶点相邻的所有顶点。 下面是用 C++ 实现无向图的代码: ```cpp #include<iostream> #include<vector> using namespace std; class Graph{ private: int V; // 顶点数量 vector<vector<int>> adj; // 邻接表 public: Graph(int V){ this->V = V; adj.resize(V); } void addEdge(int v, int w){ // 无向图邻接表需要同时添加两条边 adj[v].push_back(w); adj[w].push_back(v); } void printGraph(){ for(int i=0; i<V; i++){ cout << i << " -> "; for(int j=0; j<adj[i].size(); j++){ cout << adj[i][j] << " "; } cout << endl; } } }; int main(){ // 创建一个无向图 Graph g(5); g.addEdge(0, 1); g.addEdge(0, 4); g.addEdge(1, 2); g.addEdge(1, 3); g.addEdge(1, 4); g.addEdge(2, 3); g.addEdge(3, 4); // 打印邻接表 g.printGraph(); return 0; } ``` 在上面的代码中,我们定义了一个 Graph 类,其中 V 表示顶点数量,adj 是一个二维向量,用于存储邻接表。addEdge 函数用于向无向图中添加一条边,需要同时添加两条边。printGraph 函数用于打印邻接表。 在 main 函数中,我们创建一个无向图,并添加了一些边,然后打印邻接表。输出结果如下: ``` 0 -> 1 4 1 -> 0 2 3 4 2 -> 1 3 3 -> 1 2 4 4 -> 0 1 3 ``` 这个邻接表表示无向图如下所示: ``` 0---1 |\ /|\ | X | 2 |/ \|/ 4---3 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值