基于邻接表的Prim算法与Kruskal算法实现(C++)

本文介绍了如何使用C++基于邻接表实现Prim和Kruskal算法,详细讲解了邻接表的结构定义、构造方法以及图的打印。通过代码测试验证了算法的正确性。
摘要由CSDN通过智能技术生成

邻接表

邻接表的介绍完全可以参考数据结构之图(三)——邻接表这篇博客的介绍,在此不做赘述。

代码实现

实现邻接表最关键的就是需要存储链表。其实完全可以使用vector实现。下面我将介绍手写的邻接表实现方式。

定义结构

typedef struct ArcNode{
    // 边表指针
    int adjvex;
    struct ArcNode *next;
    int weight; // 边权
    ArcNode():adjvex(-1), next(NULL), weight(-1){
   }
    ArcNode(int a, ArcNode* b, int w): adjvex(a), next(b), weight(w) {
   }
} ArcNode;

typedef struct VNode {
    // 顶点表指针
    int data;
    ArcNode *first = NULL; // 指向顶点的下一个
    ArcNode *last = NULL; // 指向边表的最后一个
    VNode() {
   }
    VNode(int data): data(data), first(NULL), last(NULL) {
   }
} vNode;

typedef struct {
   
    int vexNum = 0, arcNum = 0;
    vector<VNode> vertices;
} ALGraph;

构造邻接表

注意传入的参数是二维数组 e d g e s edges edges,其中 e d g e s [ i ] = { x i , y i , w i } edges[i] = \{ {x_i, y_i, w_i}\} edges[i]={ xi,yi,wi}, x i , y i x_i, y_i xi,yi指的是边的两顶点, w i w_i wi指的是两顶点的边权。以下代码构造的是无向图,有向图只需要做相应的修改即可。

ALGraph makeGraph(vector<vector<int>> edges) {
   
    ALGraph g;
    int n = edges.size();
    g.arcNum = n * 2;
    for (int i = 0; i < n; ++i) {
   
        if (edges[i][0] > edges[i][1]) swap(edges[i][0], edges[i][1]);
        g.vexNum = max(g.vexNum, edges[i][1]);
    }
    g.vertices.resize(g.vexNum);
    for (int i = 1; i 
  • 35
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值