Prim算法求最小生成树,c语言实现,超详解,代码清晰

本文介绍了如何使用C语言实现Prim算法来求解最小生成树,适合初学者学习,代码详尽解释了顶点集、边的权重集以及主要函数的功能。然而,代码仅输出最小生成树顶点,未涉及最短路径求和和具体应用的扩展。
摘要由CSDN通过智能技术生成

一、简要概述

  prime算法求解最小生成树,相较于kruskal算法,在代码实现上较为简单,是一个适合初学者去学习的算法,有助于初学者了解简单的数据结构和图的原理及构造。我在这里写的代码使用的C语言,代码尽可能详细且方便理解,每个函数都有功能介绍,希望可以帮助到有需要学习的朋友。

二、有待补充与完善

代码部分仅实现了特定图的最小生成树顶点的输出,并没有最短路径的求和(可以自己补充),此外,到具体应用层面,可能还需要对图的相关数组进行扩容与修改赋值的部分。所以,代码仅供参考。

//v[N+1]----顶点集,1--A, 2--B,...., 6--F
//edge[N+1][N+1]----边的权重集, edge[i][j]---i与j之间的权重,没有通路赋值-1
//curv[N+1]----当下的顶点集
//tree[N]----最小生成树的集合,,,curv[]的结果,终态,实际未使用
#include<stdio.h>
#define N 6
int v[N+1], edge[N+1][N+1], curv[N+1];

int in_arr(int k)//判断顶点k是否在curv[]集合中
{
    int i;
    for(i=0;i<N+1;i++){
        if(curv[i]==k)
        return 1;
    }
    return 0;
}

int find_v(int j)//查找距离当前顶点集最近的顶点n
{
    int i, k, n;
    int min_adge = 10000;
    //i是没有意义的,有意义的是curv[i];
    for(i=1;i<j+1;i++){
        for(k=1;k<N+1;k++){
            if(!in_arr(k) && edge[curv[i]][k]>0 && edge[curv[i]][k]<min_adge){
                min_adge=edge[curv[i]][k];
                n = k;
            }
        }
    }
    return n;
}

void prim()
{
    curv[1]=1;
    int i=1;
    while(i<N+1){
        curv[i+1] = find_v(i);//找顶点,然后加入到顶点集中
        i++;
    }
}

void print_tree()
{
    int i;
    for(i=1;i<N+1;i++){
        printf("%c",curv[i]+64);
        if(i!=N)
        printf("-");
        else
        printf("\n");
    }
    
}

int main()
{
    int i,j;
    //顶点集初始化
    for(i=0;i<N+1;i++){
        v[i]=i;
        curv[i]=0;
    }
        
    //边的权重集初始化
    for(i=0;i<N+1;i++){
        for(j=0;j<N+1;j++)
            edge[i][j]=-1;  
    }
    //构建图
    edge[1][2]=edge[2][1]=5;edge[1][3]=edge[3][1]=6;edge[1][4]=edge[4][1]=4;
    edge[2][3]=edge[3][2]=1;edge[2][4]=edge[4][2]=2;
    edge[3][4]=edge[4][3]=2;
    edge[3][5]=edge[5][3]=5;edge[3][6]=edge[6][3]=3;
    edge[4][6]=edge[6][4]=4;
    edge[5][6]=edge[6][5]=4;
    //调用prim函数并输出最小生成树
    prim();
    print_tree();

    return 0;

}

图长这个样子:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值