Prim算法是最简单也是最直观的求最小生成树的算法,与kruskal相比,具有代码量小的特点,避免了kruskal寻找祖先等复杂数据结构,在ACM比赛中,因为时间紧张,采用prim的情况无疑比kruskal更多。
prim需要的数据结构有:
int miniestPoint; 这轮路径最短的点
int miniestDist; 这轮最短的路径
int currentDist[]; 记录每个点当前的路径长度
bool ifVisited[]; 记录哪些点已经在生成树里了。
int totalLength; 记录生成树总路径长度
prim的基本流程如下:
1.设置一个初始顶点,令初始顶点的ifVisited为true,代表该点已经在生成树里;
2.初始miniestDist为inf,设置miniestPoint为初始顶点;
3.还是进行循环:
for(int i=1;i<=v;i++){
if(ifVisited[i]==false&¤tDist[i]>g[miniestPoint][i]){
currentDist[i]=g[miniestPoint][i];
}
}
miniestDist=inf;
for(int i=1;i<=v;i++){
if(ifVisited[i]==false&¤tDist[i]<miniestDist){
miniestPoint=i;
miniestDist=currentDist[i];
}
}
totalLength+=miniestDist;
直到所有的点都在生成树里面。