普里姆算法详解
算法概述
普里姆算法是一种解决最小生成树问题的贪心算法。最小生成树问题是指一个无向图中找到一棵树,使得这棵树中包含原图的所有节点,并且所有树边的边权之和最小。
普里姆算法的基本思想是从一个任意节点开始,每次选取一个与当前生成树距离最近的节点并将其加入生成树中,直到整棵树被构建完成。
算法步骤
- 任选一点作为起始节点,将其添加到生成树中
- 找到所有与生成树相邻的节点,找到与生成树距离最近的节点,并记录距离和该节点与生成树相邻的边
- 将步骤2中找到的节点加入生成树中,并将该节点与生成树相邻的边加入生成树的边集合中
- 重复步骤2和步骤3,直到生成树包含原图的所有节点
算法示例
示例1
下面是一个无向加权图的邻接矩阵,其中数字表示边的权值。使用普里姆算法求解该图的最小生成树。
0 1 2 3 4
0 0 1 3 4 2
1 1 0 5 6 0
2 3 5 0 7 0
3 4 6 7 0 8
4 2 0 0 8 0
从节点0开始,将其添加到生成树中。此时生成树只包含节点0和边集合为空。
接下来,找到与节点0相邻的所有节点,即节点1、节点2、节点4。计算它们与生成树的距离,并记录与生成树距离最小的节点和该节点与生成树相邻的边。记录如下:
相邻节点 | 距离 | 边 |
---|---|---|
1 | 1 | (0, 1) |
2 | 3 | (0, 2) |
4 | 2 | (0, 4) |
从上述记录中,距离最小的是节点1,将其加入生成树。此时生成树中包含节点0和节点1,边集合为{(0, 1)}。
接下来,找到与生成树相邻的所有节点,即节点2和节点4。计算它们与生成树的距离,并记录与生成树距离最小的节点和该节点与生成树相邻的边。记录如下:
相邻节点 | 距离 | 边 |
---|---|---|
2 | 3 | (0, 2) |
4 | 2 | (0, 4) |
从上述记录中,距离最小的是节点4,将其加入生成树。此时生成树中包含节点0、节点1和节点4,边集合为{(0, 1), (0, 4)}。
最后,找到与生成树相邻的所有节点,即节点2。计算它们与生成树的距离,并记录与生成树距离最小的节点和该节点与生成树相邻的边。记录如下:
相邻节点 | 距离 | 边 |
---|---|---|
2 | 3 | (0, 2) |
从上述记录中,距离最小的是节点2,将其加入生成树。此时生成树中包含节点0、节点1、节点4和节点2,边集合为{(0, 1), (0, 4), (0, 2)}。此时可以确认,生成树已经包含了原图的所有节点。
示例2
下面是一个有向加权图的邻接矩阵,其中数字表示边的权重。使用普里姆算法求解该图的最小生成树。
0 1 2 3 4
0 0 1 3 4 2
1 0 0 -5 -6 0
2 0 5 0 7 0
3 4 6 -7 0 8
4 2 0 0 8 0
在这个有向图中,节点1和节点3均无法到达其它节点,因此使用普里姆算法时,应该从可达的节点开始。例如,从节点0开始。
从节点0开始,将其添加到生成树中。此时生成树只包含节点0和边集合为空。
接下来,找到所有能够到达且与生成树相邻的节点,即节点1、节点2和节点4。计算它们与生成树的距离,并记录与生成树距离最小的节点和该节点与生成树相邻的边。记录如下:
相邻节点 | 距离 | 边 |
---|---|---|
1 | 1 | (0, 1) |
2 | 3 | (0, 2) |
4 | 2 | (0, 4) |
从上述记录中,距离最小的是节点1,将其加入生成树。此时生成树中包含节点0和节点1,边集合为{(0, 1)}。
接下来,找到所有能够到达且与生成树相邻的节点,即节点2和节点4。计算它们与生成树的距离,并记录与生成树距离最小的节点和该节点与生成树相邻的边。记录如下:
相邻节点 | 距离 | 边 |
---|---|---|
2 | 3 | (0, 2) |
4 | 2 | (0, 4) |
从上述记录中,距离最小的是节点4,将其加入生成树。此时生成树中包含节点0、节点1和节点4,边集合为{(0, 1), (0, 4)}。
最后,找到所有能够到达且与生成树相邻的节点,即节点2。计算它们与生成树的距离,并记录与生成树距离最小的节点和该节点与生成树相邻的边。记录如下:
相邻节点 | 距离 | 边 |
---|---|---|
2 | 3 | (0, 2) |
从上述记录中,距离最小的是节点2,将其加入生成树。此时生成树中包含节点0、节点1、节点4和节点2,边集合为{(0, 1), (0, 4), (0, 2)}。此时可以确认,生成树已经包含了原图的所有节点。
算法复杂度
普里姆算法的时间复杂度为O(mlogn),其中m为边数,n为节点数。这是因为算法需要将边按照权值排序,并且使用了最小堆来提高寻找距离最小节点的速度。
算法应用
普里姆算法主要应用于网络规划、路由选择、单位距离最短路问题等领域。在实际中,除了使用邻接矩阵表示图形外,还可以使用邻接表和优先队列等数据结构来实现普里姆算法。