最小生成树之prim算法,prim适合计算边稠密的最小生成树。
#include<iostream>
using namespace std;
#define num 6
#define max 100
void prim(int n,int a[][num],int u[],int w[],int b[])
{
for(int i=1;i<num;i++)
{
u[i]=0;//初始时均为未选中状态
w[i]=a[0][i];//起点均为第一个结点,权值均为第一个节点到它的权值。
b[i]=0;//前一个结点均为第一个结点
}
u[0]=1;//选中第一个结点
int j,min;
for(int i=1;i<n;i++)
{
j=0;min=max;
for(int m=1;m<n;m++)
{
if(!u[m]&&w[m]<min)
{
min=w[m];
j=m;
}
}//挑选出现有的权值最小的那一个所连接点。
u[j]=1;//将其加入
printf("%d,%d\n",j+1,b[j]+1);
for(int m=1;m<n;m++)
{
if(!u[m]&&a[j][m]<w[m])
{
w[m]=a[j][m];
b[m]=j;
}
}//利用新加入的结点更新w[]
}
}
int main()
{
int u[num],w[num],b[num],a[num][num];
for(int i=0;i<num;i++)
{
for(int j=0;j<num;j++)
{
a[i][j]=100;
}
}
a[0][1]=6,a[0][2]=1,a[0][3]=5;
a[1][0]=6,a[1][2]=5,a[1][4]=3;
a[2][0]=1,a[2][1]=5,a[2][3]=5,a[2][4]=6,a[2][5]=4;
a[3][0]=5,a[3][2]=5,a[3][5]=2;
a[4][1]=3,a[4][2]=6,a[4][5]=6;
a[5][3]=2,a[5][2]=4,a[5][4]=6;
prim(6,a,u,w,b);
}