图之Prime算法(邻接表)实现----最小生成树

1.prime算法思想:(只与顶点有关)

prime算法求最小生成树时,和边数无关,只和顶点的数量有关,时间复杂度是O(n^2),所以呢,适合于求稠密网的最小生成树;

将一个图的顶点分为两部分,一部分是最小生成树的集合,这里就记为(A集合),另一部分是未处理的顶点集合.
首先,选择一个节点,将这个节点加入A集合,然后,对集合A中的顶点遍历,找出A中顶点关联的边权值最小的点加入A集合。
不断重复第二步,直到B集合中所有的顶点加入A集合结束.
得到的A集合就是最小生成树的顶点集合.

具体的实现过程:

定义一个结构体来保存最小生成树的顶点结合.

typedef struct{
char data;
int lowcost;
}closedge[MAXLEN]; //MAXLEN 宏定义最大的顶点数
closedge myedge;

  1. 将第一个点放入最小生成树的集合中,然后把myedge[i].data置为第一个顶点的值,将myedge[i].lowcost置为0,代表这个点已经在最小生成树中;

  2. 从第二个点开始,初始化myedge.lowcost[i]的值为和第一个点相连的边的权值。

4.找最小权值的边.

5.更新最小生成树集合.

看代码来解释,还是具体的实例解释这个算法,理解起来比较容易;

#include<stdio.h>
#include<stdlib.h>
#define MAXVEX  20
#define  INFINE  32678
typedef struct Stack
{
    int data;
    struct Stack *next;
}LinkStack;
typedef struct Queue
{
    int data;
    struct Queue *next;
}LNode;
typedef struct
{
    LNode *front;
    LNode *rear;
}LinkQueue;
typedef struct ArcNode
{
    int adjvex;
    int weight;
    struct ArcNode *next;
}ArcNode;
typedef struct VertexNode
{
    char vexdata;
    ArcNode *head;
}VertexNode;
typedef struct
{
    VertexNode vertex[MAXVEX];
    int vexnum;  //顶点数 
    int arcnum;  //边数
}AdjList;
typedef struct{
    char data;
    int Plowcost;
}closedge[MAXVEX];
/********************************栈的操作******************************************/
LinkStack *Init_LinkStack(LinkStack *T)
{
    T=(LinkStack *)malloc(sizeof(LinkStack));
    T->next=NULL;
    return T;
}
int IsEmpty_LinkStack(LinkStack *T)
{
    if(T->next!=NULL){
        return 0;
    }
    return 1;
}
LinkStack* Push_LinkStack(LinkStack *T,int t)
{
    LinkStack *s=(LinkStack *)malloc(sizeof(LinkStack));
    if(s==NULL){
        return NULL;
    }
    s->data=t;
    s->next=T->next;
    T->next=s;
}
LinkStack *Pop_LinkStack(LinkStack *T,int *t)
{
    LinkStack *p=T->next;
    if(T->next==NULL){
        return NULL;
    }
    *t=p->data;
    T->next=p->next;
    free(p);
}
/*************************队列的操作****************************/
LinkQueue *Init_LinkQueue()
{
    LinkQueue *q=(LinkQueue *)malloc(sizeof(LinkQueue));
    LNode *p=(LNode 
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值