prim 求最小生成树(邻接矩阵)

本文介绍了一个使用Prim算法寻找最小生成树的C++实现案例。通过邻接矩阵表示图结构,采用数组记录顶点是否被访问及到已生成树的距离,每轮迭代找出未包含在树中且距离最近的顶点加入树中,并更新其它顶点到树的距离。

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

#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
const int INF=0x3f3f3f3f;//无穷数
const int maxn=100;//最大城市数;
int guide[maxn][maxn];//邻接矩阵
int n,dis[maxn];//城市数  距当前树距离
bool vst[maxn]={false};//访问标记
int re=0;//最小花费
void prime(int x){
    memset(dis, INF, sizeof(dis));
    dis[x]=0;
    for(int i=1;i<=n;i++){//每循环一次加入一个,共n次
        int u=-1,min=INF;//新加入下标 最小花费
        for(int j=1;j<=n;j++){
            if(vst[j]==false&&dis[j]<=min){//小于等于更安全
                u=j;
                min=dis[j];
            }
        }
        vst[u]=true;
        re+=min;
        for(int j=1;j<=n;j++){
            int v=guide[u][j];
            if(vst[j]==false&&v<dis[j]){//更新dis
                dis[j]=v;
            }
        }
    }
}
int main(){
    memset(guide, INF, sizeof(guide));
    cin>>n;int k;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>k;
            if(k!=-1)guide[i][j]=k;
        }
    }
    prime(1);
    cout<<re<<endl;


}
/*
6
-1  6   1   5   -1  -1
6   -1  5   -1  3   -1
1   5   -1  5   6   4
5   -1  5   -1  -1  2
-1  3   6   -1  -1  6
-1  -1  4   2   6   -1
*///re=15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值