普里姆算法在找最小生成树时,将顶点分为两类,一类是在查找的过程中已经包含在树中的(假设为 A 类),剩下的是另一类(假设为 B 类)。
对于给定的连通网,起始状态全部顶点都归为 B 类。在找最小生成树时,选定任意一个顶点作为起始点,并将之从 B 类移至 A 类;然后找出 B 类中到 A 类中的顶点之间权值最小的顶点,将之从 B 类移至 A 类,如此重复,直到 B 类中没有顶点为止。所走过的顶点和边就是该连通图的最小生成树。
下面来看一个例题:
例题中用&代表无穷。没有直接到达的边就写无穷。
选V1作为第一个生长点(第一个生长点可以随意选)。
设出两个集合,vertex1(用来装生长点),vertex2(用来装不是生长点的顶点)。
第一列为生长点的集合,第二列为不是生长点的集合。
由图可知V1到各个顶点的距离一下所示:
v2 | v3 | v4 | v5 | v6 | ||
{v1} | {v2,v3,v4,v5,v6} | V1 6 | V1 1 | V1 5 | V1 & | V1 & |
明显可知:V3最小,所以V3为下一个生长点,V3进入到集合vertex1中。
接下来看,V3与各个点之间的距离,若比原来小则进行替换,若比原来大或等于原来的数值则不变。
v2 | v3 | v4 | v5 | v6 | ||
{v1} | {v2,v3,v4,v5,v6} | V1 6 | V1 1 | V1 5 | V1 & | V1 & |
{V1,V3} | {v2,v4,v5,v6} | v3 5 | v1 5 | v3 6 | v3 4 | |
显然v3到v6最小,则V6作为下一个生长点,v6进入到vertex1中
重复上述步骤:
v2 | v3 | v4 | v5 | v6 | ||
{v1} | {v2,v3,v4,v5,v6} | V1 6 | V1 1 | V1 5 | V1 & | V1 & |
{V1,V3} | {v2,v4,v5,v6} | v3 5 | v1 5 | v3 6 | v3 4 | |
{v1,v3,v6} | {v2,v4,v5} | v3 5 | v6 2 | v3 6 | ||
v6到v4最小,所以v4作为下一个生长点,进入vertex1中
v2 | v3 | v4 | v5 | v6 | ||
{v1} | {v2,v3,v4,v5,v6} | V1 6 | V1 1 | V1 5 | V1 & | V1 & |
{V1,V3} | {v2,v4,v5,v6} | v3 5 | v1 5 | v3 6 | v3 4 | |
{v1,v3,v6} | {v2,v4,v5} | v3 5 | v6 2 | v3 6 | ||
{v1,v3,v6,v4} | {v2,v5} | v3 5 | v3 6 | |||
这次v3到v2为最小生长点,所以v2进入到vertex1中
v2 | v3 | v4 | v5 | v6 | ||
{v1} | {v2,v3,v4,v5,v6} | V1 6 | V1 1 | V1 5 | V1 & | V1 & |
{V1,V3} | {v2,v4,v5,v6} | v3 5 | v1 5 | v3 6 | v3 4 | |
{v1,v3,v6} | {v2,v4,v5} | v3 5 | v6 2 | v3 6 | ||
{v1,v3,v6,v4} | {v2,v5} | v3 5 | v3 6 | |||
{v1,v3,v6,v4,v2} | {v5} | v2 3 |
当前只剩下一个v5,所以v5进入vertex1中
v2 | v3 | v4 | v5 | v6 | ||
{v1} | {v2,v3,v4,v5,v6} | V1 6 | V1 1 | V1 5 | V1 & | V1 & |
{V1,V3} | {v2,v4,v5,v6} | v3 5 | v1 5 | v3 6 | v3 4 | |
{v1,v3,v6} | {v2,v4,v5} | v3 5 | v6 2 | v3 6 | ||
{v1,v3,v6,v4} | {v2,v5} | v3 5 | v3 6 | |||
{v1,v3,v6,v4,v2} | {v5} | v2 3 |
所以最小生成树为: