前言
最小生成树:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。
最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。
一、prim算法-让一颗小树长大
prim算法
以点为对象,挑选与点相连的最短边来构成最小生成树。
1.分步图解
2.代码示例
T={};
TV={0};
while(T contains fewer than n-1 edges){
let (u,v) be a least cost edge suah that u in TV and v not in TV;
if(there is no such edge)break;
add v to TV;
add (u,v) to T;
}
if(T contains fewer than n-1 edges)
printf(“No spanning tree\n”);
3.算法复杂度
Prim算法:O(eloge)
二、kruskal算法-将森林合并成树
prim算法
以边为对象,不断地加入新的不构成环路的最短边来构成最小生成树。
1.分步图解
2.代码示例
T={};
while(T contains less than n-1 edges && E is not empty){
chooose a least cost edge (v,w) from E;
delete (v,w) from E;
if ( ( v,w ) dose not create a cycle int T)
add (v,w) to T;
else
discard(v,w);
}
if (T contains fewer than n-1 edges)
printf(“No spanning tree\n”);
3.算法复杂度
Kruskal算法:O(n²)