最小生成树之prime算法
***最小生成树:一个连通图的生成树中,所有边的权值加起来最小的生成树;称为最小生成树;
【简介】:Prime算法可在加权连通图里搜索最小生成树。即:所有边的权值之和为最小。
Prime算法是图论中求最小生成树的一种算法,与之类似的算法还有Kruskal算法;
区别:
Prime算法适合边多定点少的图;
Dijkstra算法适合边少定点多的图;
1.1 存图方式
要求最小生成树,当然首先要把图存进一个东西中,这样才能图对进行搜索操作。
1.邻接矩阵
存图思想:用一个矩阵来记录一个图,矩阵第 i 行第 j 列的值就表示顶点 i 到顶点 j 的权值
int matrix[MAX][MAX]={
0};//邻接矩阵存储图
void init(){
//初始化 min_distance[N];visited[N];数组
memset(visited,0,sizeof(visited));
for(int i=1;i<=nodeNum;i++){
for(int j=1;j<nodeNum;j++){
if(i == j)
matrix[i][j]=0;
else
matrix[i][j]=INF;
}
}
}
init();
for(int i=1;i<=nodeNum;i++){
for(int j=1;j<=nodeNum;j++){
cin>>matrix[i][j];
}
}
1.2 Prime算法分解
1.2.1 用到的数组
我写的这个Prime算法存图用的是邻接矩阵。
int min_distance[MAX]; //记录该结点到生成树的最短路径
难点在于理解min_distance数组为每个结点到生成树的最短路径
int min_distance[MAX]; //记录该结点到生成树的最短路径
bool visited[MAX]; //标记数组,标记该结点是否纳入集合,即该结点是否访问过;false 没有被访问
1.2.2 初始化
初始化:自己与自己的距离为0,自己与别的结点的距离初始化为无穷大,即,表示不连通;
将所有的结点都标记为为访问,我这用false表示未访问,true表示已访问;
void init(){
//初始化 min_distance[N];visited[N];数组
memset(visited,0,sizeof(visited));
for(int i=1;i<=nodeNum;i++){
for(int j=1;j<nodeNum;j++){
if(i == j)
matrix[i][j]=0;
else
matrix[i][j]=INF;
}
}
}
1.2.3 Prime算法主体
传入一个节点,当然,传入的这个节点是随意的。将这个点到其他点的距离存入min_distance数组,并将传入的这个点标记为已访问。
然后找出从start(传入的那个点)出发的路径中的最短的一个路径;并将它到达的那个点记性并标记。然后更新min_distance数组(重点):如果该结点没有被访问过,且点距离当前点的距离更近,就执行更新;最后min_distance数组中就是最小生成树的最短路径的集合;对其求和,即是最小生成树的最短路径;
代码实现:
int prime(int start){
//start是任意一个开始结点,此节点随意;将st看做最小生成树的根节点
//开始结点的处理
int i;
for(i=1;i<=nodeNum;i