数据结构--图的最小生成树Prim算法

本文介绍使用Prim算法求解图的最小生成树,并通过C++实现该算法。文章详细展示了Prim算法的步骤,包括初始化邻接矩阵、创建图结构、求解最小生成树及路径总和。

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

数据结构–图的最小生成树Prim算法

//5.21编程集训——2.最小生成树Prim算法; 
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#define MAX_SIZE 10 
#define MAX 1000//用这个数来表示无穷大 
using namespace std;
//根据观察发现,这个算法应该使用邻接矩阵
struct QGraph{//邻接矩阵的结构表示 
    int matrix[MAX_SIZE][MAX_SIZE];
    int n,e;
}; 

void Init(QGraph *Q){//初始化邻接矩阵 
    for(int i=0;i<Q->n;i++){
        for(int j=0;j<Q->n;j++){
            Q->matrix[i][j]=MAX;    
        }   
    }
}


void Creat(QGraph *Q){ 
    int a,b,num;//表示两个节点以及两个节点之间的长度
    cout<<"请输入顶点数以及边数:"<<endl;
    cin>>Q->n>>Q->e;
    cout <<"请输入节点以及节点之间的距离:"<<endl;
    for(int i=1;i<=Q->e;i++){
        cin>>a>>b>>num;
        Q->matrix[a][b]=num;
        Q->matrix[b][a]=num;
    }    
}

void Prim(QGraph *Q,int v,int &sum){//求解最小生成树包括路径的和
   int distance[MAX_SIZE];//表示其余所有顶点到已经生成的树的最小距离 
   int sorted[MAX_SIZE];//表示是否已经加入到最小生成树里面
    int mindis;//最小数值 
   for(int i=0;i<Q->n;i++){
    sorted[i]=0;//初始化表示都没有被访问过 
    }
    sorted[v]=1;
    for( int j=0;j<Q->n;j++){
        distance[j]=Q->matrix[v][j];
    }//初始化第一个选中的元素到各条边的距离 
    int t;


for( int k=1;k<Q->n;k++){//k之所以可以从1开始
    mindis=100;
    for( int m=0;m<Q->n;m++){
        if((sorted[m]==0)&&(distance[m]<mindis)){
            mindis=distance[m];
           t=m;
        }   
    }

    sum=sum+mindis;//逐步累积的和
    cout<<sum<<endl;   
    sorted[t]=1;
    for( int p=0;p<Q->n;p++){
        if((sorted[p]==0)&&(Q->matrix[t][p]<distance[p]))
        distance[p]=Q->matrix[t][p];    
    }

}

     cout<<sum<<endl;
     /*for( int q=0;q<Q->n;q++){
        if(sorted[q]==1)
        cout<<q<<endl;
     }  //输出构成最小生成树的各个元素 */ 
}


int main(){
    QGraph Q;
    int sum=0;
    cout<<"请输入一个数作为开始的节点:"<<endl;
    int v;
    cin>>v;
    Init(&Q);
    Creat(&Q);
    Prim(&Q,v,sum);
    return 0;
} 

调试结果如图所示:
这里写图片描述

这个算法有一个小细节需要注意:
主体for循环的循环次数不是节点的个数,而是节点的个数-1;
如下图所示:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱码仕1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值