最小生成树(MST)
- 连通n个城市,至少需要n-1条边,若是无向图,则连接n个城市,最多可以设置n(n-1)/2条线路,求如何求得n-1条路使花费最少
- 有两种算法实现:Prim算法和Kruskal算法
一.Prim算法
1.说明
- 从一个点开始找,找到与其相邻的最小的边,将点并入与第一个点的集合,将他们作为集合寻找最小的点,直到所有顶点被加入集合,就找到最小花费的路
- 设置lowcost[i],i表示边的终点,当lowcost[i]=0时,说明以i为终点的边并入到了MST中
- 设置mst[i]:表示对应lowcost[i]的起点,即边<mst[i],i>是MST的一条边,当mst[i]=0表示起点i加入到了MST中
- 将没有边的点改为无穷大
2.代码实现
2.1存储图结构:初始化
- 在初始化边的数值时将他们不再赋值为0,而改为最大值
- 无穷大的数值可以用一个字符来表示,而当edges[i][j]中i和j相等时,我们将其初始化为0
#define MAX_COST 0x7FFFFFFF
2.2求解最小生成树
void minSpanTree_Prim(Graph *g,char T)
{
int* lowcost=(int*)malloc(sizeof(int)*g->numv);
int *mst=(int*)malloc(sizeof(int)*g->numv);
int k=getvpos(T);
for(int i=0;i<g->numv;i++)
{
if(i==k)
{
lowcost[i]=0;
mst[i]=0;
}
else
{
lowcost[i]=getweight(g,i,k);