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;
将第一个点放入最小生成树的集合中,然后把myedge[i].data置为第一个顶点的值,将myedge[i].lowcost置为0,代表这个点已经在最小生成树中;
从第二个点开始,初始化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