普利姆算法求最小生成树(用数组表示)



 #include<iostream>
#include<stdlib.h>
#include<time.h>
#include<iomanip>
#include<cstdlib>
using namespace std;
//普利姆算法求最小生成树
void Btree(int *a1,int n,int **a,int q)//a1的第一个数为要构建最小生成树的起点,n为要建立的图的顶点数a1的元素个数为n
{
int min,m,i,lq,lz;//min用来记录最小权值
min=100;
a1[0]=q;
for( m=0;m<n;m++)
a[m][q]=0;
for(int x=1;x<=5;x++)
{
i=0;min=100;
do
{int j=0;
for(;j<n;j++)
{
if(min>=a[ a1[i] ][j] && a[ a1[i] ][j]!=0)
{
min=a[ a1[i] ][j];
lq=a1[i];lz=j;//分别记录该权值路径的起点和终点
}
}
i++;
}while(a1[i]!=-1);
a1[i]=lz;
for( m=0;m<n;m++)
a[m][lz]=0;
cout<<lq<<' '<<lz<<' '<<min<<endl;
}

}
int buildgraph(int n,int **a)
{
int i,j,edge,p1,p2,w;
int *lj=new int[n-1];
int *qz=new int[n-1];
for(i=0;i<n;i++)          //初始化数组的每个元素为0
for(j=0;j<n;j++)
{
a[i][j]=0;
}
cout<<"请输入图的边数:"<<endl;
cin>>edge;
cout<<"请输入每条边的顶点(权值随机产生):"<<endl;
srand(time(0));
for(i=0;i<edge;i++)
{
cin>>p1>>p2;
w=rand()%100+1;
a[p1][p2]=w;
a[p2][p1]=w;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cout<<setw(3)<<a[i][j]<<"  ";
}
cout<<endl;
}
return edge;
}
int main()
{
int q,n,i,e,j;
cout<<"请输入要建立的图的顶点数:"<<endl;
cin>>n;
int *a1=new int[n];//a1用来存放已经在最小生成树中的顶点
for(i=0;i<n;i++)
{
a1[i]=-1;
}
int **a;
int **b;
a=new int*[n];
b=new int*[n];
for(i=0;i<n;i++)
{
a[i]=new int[n];
b[i]=new int[n];
}
e=buildgraph(n,a);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
b[i][j]=a[i][j];
cout<<"要构建最小生成树的起始点:";
cin>>q;
//a1[0]=q;
cout<<"普利姆算法求最小生成树"<<endl;
Btree(a1,n,a,q);
cout<<endl;
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值