prim 算法优化:
普通法:
int nearvex[Maxn], lowest[Maxn], road[Maxn][Maxn], n;
int prim(int u) //从u出发构造最小生成树,共n个点
{
int i, j, k, min, cost=0;
for(i=0;i<n;i++){//顶点下标从0开始
lowest[i]=road[u][i]; //赋初值
nearvex[i]=u;//距离i的前一节点
}
nearvex[u]=-1;//-1表示已经该点已加入的最小生成树
for(i=1;i<n;i++){//再加 (n-1) 个点(每次在未加入最小生成树的点集中找距离已建树点集的最小值)
min=INF, k=-1;
for(j=0;j<n;j++){
if(nearvex[j] != -1&&lowest[j]<min){
k=j;
min=lowest[j];
}
}
if(k != -1){
nearvex[k]=-1;
cost+=lowest[k];
for(j=0;j<n;j++){
if(nearvex[j] != -1&&road[k][j]<lowest[j])
lowest[j]=road[k][j];//从k出发更新最小值
}
}
}
return cost;
}
精简法:
#define INF 0x3f3f3f3f
#define maxn 10000
//记得调用前先在主函数内初始化vis[]和mincost[]的值
memset(vis, 0, sizeof(vis));
memset(mincost, INF, sizeof(mincost));
int mincost[maxn];
int prim()
{
int i, j, v, cost=0;
mincost[0]=0;//第一个点置为0
while(true){
v=-1;
for(i=0;i<n;i++){//下标从0开始,共n个点
if(!vis[i]&&(v==-1||mincost[i]<mincost[v]))//找最小值
v=i;
}
if(v==-1) break;
vis[v]=1; //标记访问
cost+=mincost[v];
for(j=0;j<n;j++){
if(!vis[j]&&road[v][j]<mincost[j])
mincost[j]=road[v][j];//更新最小值
}
}
return cost;
}