Prim — 最小生成树

本文详细介绍了普里姆算法在无向图中搜索最小生成树的过程,包括算法的主要步骤和具体代码实现,并通过实例验证了算法的有效性和正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Prim算法,普里姆算法,在无向图中搜索最小生成树。

算法实现的主要步骤:
(1) 初始化
所有点都初始化为没有被访问,初始化根结点到各结点的距离,存放在lowcost[]数组中;

(2)寻找最小值
从根结点开始,其依据:一端连接,另一端未连接,寻找最小值
找到最小值后,更新lowcost[],未选结点到已选结点(可能已经选中了多个结点)中的最小值

(3)重复第(2)步,直到所有点都被选中,则算法结束。

本文依据下图对算法实现:

这里写图片描述


具体代码如下,已经**在vs2010测试通过**。

#include <iostream>
using namespace std;

#define UndirectedGraphNode 6
#define INFINITE 1000

void Prim(int undirectedGraph[][UndirectedGraphNode], bool visited[], int lowcost[], int path[])
{
    //初始化
    memset(visited, 0, sizeof(bool) * UndirectedGraphNode);//所有点都没有被访问
    for(int i = 1; i < UndirectedGraphNode; i++)
        lowcost[i] = undirectedGraph[0][i];//根结点到各结点的距离

    //根结点被访问
    int k = 0;//记录加入路径中的结点的顺序
    visited[0] = true;
    path[k] = 0;//记录加入路径中的结点的下标
    int min;
    int minIndex;

    //一端连接,另一端未连接,寻找最小值
    for(int j = 1; j < UndirectedGraphNode; j++)//外层循环,每次循环确定一个点
    {
        min = INFINITE;//每次循环要重新赋值
        //寻找最小值
        for(int i = 1; i < UndirectedGraphNode; i++)
        {
            //存在多个条件的判断,应将最可能为假的条件放在前面,减少判断次数
            if(false == visited[i] && lowcost[i] < min)
            {
                min = lowcost[i];
                minIndex = i;
            }
        }

        path[++k] = minIndex;//对应结点加入路径中,区分 ++k 与 k++
        visited[minIndex] = true;//该点已经被访问

        //更新lowcost[]
        //lowcost[],未选结点到已选结点中的最小值
        for(int i = 1; i < UndirectedGraphNode; i++)
        {
            if(false == visited[i] && lowcost[i] > undirectedGraph[minIndex][i])
                lowcost[i] = undirectedGraph[minIndex][i];
        }
    }
}

void PrimRun()
{
    //点与点之间存在边,权重为非零值,非无穷大值
    //点与点之间不存在边,权重为无穷大值
    int undirectedGraph[][UndirectedGraphNode] = 
    {
        {INFINITE, 12, INFINITE, INFINITE, 9, 9},
        {12, INFINITE, 6, INFINITE, INFINITE, 15},
        {INFINITE, 6, INFINITE, 3, INFINITE,  17},
        {INFINITE, INFINITE, 3, INFINITE, 4, 20},
        {9, INFINITE, INFINITE, 4, INFINITE,  9},
        {9, 15, 17, 20, 9, INFINITE},
    };

    bool visited[UndirectedGraphNode];
    int path[UndirectedGraphNode];
    int lowcost[UndirectedGraphNode];

    Prim(undirectedGraph, visited, lowcost, path);

    for(int i = 0; i < UndirectedGraphNode; i++)
        cout<<"v"<<path[i] + 1<<" ";//v1表示第一个结点
    cout<<endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
    PrimRun();//调用
    return 0;
}

算法运行结果如图所示:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值