目录
- 图的最小生成树算法之Prim算法简介
- Prim算法举例及其详解
- Prim代码块
- 图的最小生成树算法之Kruskal算法简介
- Kruskal算法举例及其详解
- Kruskal代码块
图的最小生成树算法之Prim算法简介
1、生成树
如果连通图G的一个子图是一棵包含G的所有顶点的树,则该子图称为G的生成树(SpanningTree)。
生成树是连通图的包含图中的所有顶点的极小连通子图。
图的生成树不惟一。从不同的顶点出发进行遍历,可以得到不同的生成树。
2.算法简单描述
1).输入:一个加权连通图,其中顶点集合为V,边集合为E;
2).初始化:Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {},为空;
3).重复下列操作,直到Vnew = V:
a.在集合E中选取权值最小的边(u, v),其中u为集合Vnew中的元素,而v不在Vnew集合当中,并且v∈V(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);
b.将v加入集合Vnew中,将(u, v)边加入集合Enew中;
4).输出:使用集合Vnew和Enew来描述所得到的最小生成树。
Prim代码块
#include<stdio.h>
#include<stdlib.h>
#define MAXV 100
#define LIMITLESS 9999
typedef struct
{
int no; //顶点编号
int info; //顶点其他信息
} VertexType;
typedef struct
{
int n;
int e;//定点数,边数
int edges[MAXV][MAXV];//邻接矩阵的数组表现
VertexType vexs[MAXV]; //顶点信息
}MGraph;
void creat(MGraph *G)
{
int i, j, k, w;
int start, end;
printf("请输入顶点数和边数:\n");
scanf("%d%d", &(G->n), &(G->e));
getchar();
printf("请输入顶点信息:\n");
for (i = 0; i<G->n; i++)
{
scanf("%d%d", &(G->vexs[i].no), &(G->vexs[i].info));
}
for (i = 0; i<G->n; i++)
{
for (j = 0; j<G->n; j++)
{
if (i == j)
{
G->edges[i][j] = 0;
}
else
{
G->edges[i][j] = LIMITLESS;
}
}
}
printf("请输入 图的顶点 边和它的权值:\n");
for (k = 0; k<G->e; k++)
{
scanf("%d%d%d", &start, &end, &w);
G->edges[start][end] = w;
G->edges[end][start] = w;//无向图时用到
}
}
void