n^2级别,C语言
int lowcost[MAXN],closest[MAXN];//lowcost记录到最小生成树的距离,closest为前驱数组
int prim(int v0)
{
int i,j,mindis,minone;
int ans = 0;/*用来记录最小生成树的总长度*/
/*各点距离初始化*/
for(i = 0;i < n;i++)//以v0为始点开始初始化
{
lowcost[i] = cost[v0][i];
closest[i] = v0;
}
for(i = 0;i < n-1;i++)
{
mindis = INF;//初始化最小值
for(j = 0;j < n;j++)
if(lowcost[j] && mindis > lowcost[j])//点j不在树内,且更短
{
mindis = lowcost[j];
minone = j;
}
/*将找到的最近点加入最小生成树*/
ans += lowcost[minone];
lowcost[minone] = 0;
/*修正其他点到最小生成树的距离*/
for(j = 0;j < n;j++)
if(cost[j][minone] < lowcost[j])//如果j到minone的距离更小,更新
{
lowcost[j] = cost[j][minone];
closest[j] = minone;
}
}
return ans;
}
/*
算法描述:
prim:
首先,定义变量
int 总和=0,循环变量,最小值数组中指针,最小值参数;
Int 距离数组(一维)表示点到最小生成树的距离,前驱节点数组(一维)表示节点在最小生成树内的前驱节点;
初始化距离数组(全部为最大值),前驱数组(-1)
循环 点数次
重置最小值参数
遍历所有点来找到距离最小生成树中最小的点,更新最小值参数与最小值数组中指针
更新总和(总和+=最小边权值)
修正其他点到最小生成树的距离(如果其他点到最小生成树新加入节点的距离小于原距离,则进行更新)
*/