最小生成树(prim)(C++)

程序输入:n为n组测试数组

                    v为v个对象,e为接下来将输入e组关系

例如:

  输入为:           

            1(一组测试数据)

             4     6(4个对象(为1   2     3    4),接下来将有6组关系)

             1     2       10   (1与2之间的权值为10)

             2     3       10

             3     1       10

             1     4       1

             2     4       1

             3     4       1

输出为:

          3(为能够连接所有对象的最小权值和)



程序:

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
#define MaxInt 0x3f3f3f3f


void prim(int** map,int& result,int n)
{
int* visited=new int[n+1];//已访问区
int *low=new int[n+1];//小权值数组
int pos,min;


memset(visited,0,sizeof(int)*(n+1));//初始化为0
memset(low,MaxInt,sizeof(int)*(n+1));//初始化为极大值
visited[1]=1;pos=1;
result=0;
for(int i=1;i<=n;i++)
     low[i]=map[1][i];


for(int i=1;i<n;i++)
{
min=MaxInt;
for(int j=1;j<=n;j++)
{
if(low[j]<min&&visited[j]==0)
{min=low[j];
pos=j;}

}
result=result+min;
visited[pos]=1;
for(int j=1;j<=n;j++)
{
if(visited[j]==0&&low[j]>map[pos][j])
low[j]=map[pos][j];
}

}

}


int main()
{
int n;
while(cin>>n)
{
int v,e;
cin>>v>>e;
int **map=new int* [v+1];
//邻接矩阵初始化为一个极大值
for(int i=0;i<v+1;i++)
{ map[i]=new int[v+1];
memset(map[i],MaxInt,sizeof(int)*(v+1));}
//邻接矩阵初始化
 for(int i=0;i<e;i++)
 {
int m,n,tmp;
cin>>m>>n>>tmp;
map[m][n]=tmp;
map[n][m]=tmp;
 
 }
 int result=0;
 //调用最小生成树prim算法
 prim(map,result,v);
 
cout<<result<<endl;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值