求最小生成树的prime算法

本文介绍了一种使用Prim算法求解最小生成树的方法。通过不断选择权重最小的边加入到最小生成树中,并更新各顶点到已选顶点集的距离,最终构造出整张图的最小生成树。代码实现了读取边的权重、维护最小生成树的成本及构建过程。

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

#include<iostream>
#include <stdio.h>
#include <memory.h>
#include <queue>
using namespace std;
const int IN = 1000000 ;
int G[105][105];
int path[105][105];
int M,N;
int locost[105];
int parent[105];
int FindMin();
int cost;
void Prime()
{
    for(int i=1; i<=N; i++)
    {
        locost[i] = G[1][i];
        parent[i] = 1;
    }
    locost[1] = 0;
    parent[1] = -1;
    for(int i=1; i<N; i++)
    {
        int k = FindMin();
        if(k)
        {
            cost+=locost[k];
            locost[k] = 0;//把k归入最小生成树
            for(int j=1; j<=N; j++)
            {
                if(locost[j] && G[k][j]<=locost[j])//调整距离
                {
                    locost[j] = G[k][j];
                    parent[j] = k;
                }
            }
        }
        else
            cout<<"error"<<endl;
    }
}
int FindMin()
{
    int Min = IN,k=0;
    for(int i=1; i<=N; i++)
        if(locost[i]&&locost[i]<Min)
        {
            Min = locost[i];
            k=i;
        }
    return k;
}
int main()
{
    cin >> M >>N;
    for(int i=1; i<=N; i++)
        for(int j=1; j<=N; j++)
            G[i][j] = IN;
    while(M--)
    {
        int s,d,l;
        cin >> s >> d >> l;
        G[s][d] = l;
        G[d][s] = l;
    }
    cost = 0;
    Prime();
    cout<<cost<<endl;
    return 0;
}

原理是每次把权重最小的边归入最小生成树,然后调整距离。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值