Prim算法是一种求解最小生成树问题的贪心算法。其基本原理是:每次从未被选择的顶点中选择一个距离当
前生成树最近的顶点加入生成树,直到所有的顶点都被选择。
以下是Prim算法的详细步骤:
1. 初始化:选取图中的任一顶点作为起始点,将其加入生成树中。对于每个顶点,初始化一个距离数组,
用于存储当前生成树到该顶点的距离。同时,初始化一个访问数组,标记每个顶点是否已被访问。
2. 开始循环:当生成树中顶点个数小于总顶点数时,执行以下步骤:
a. 在所有未被访问的顶点中,选择距离最小的顶点,将其加入生成树中。
b. 更新距离数组:对于新加入生成树的顶点的所有邻居,如果从新顶点到邻居的距离小于从已访问的顶
点到邻居的距离,则更新距离数组中该邻居的距离。
c. 标记新加入的顶点为已访问。
d. 将距离数组中等于无穷大的值(表示不可达)设为0,以便于后续选择新的顶点。
3. 结束循环:当所有的顶点都被加入生成树中时,算法结束。
4. 输出结果:输出生成树中的所有边和对应的权值。
需要注意的是,Prim算法的实现过程中需要使用一个优先队列(如小根堆)来存储距离数组和对应的顶点编
号。每次选择距离最小的顶点时,可以从优先队列中取出距离最小的顶点,并将其加入生成树中。同时,需
要更新距离数组和访问数组,以便于后续选择新的顶点。
此外,由于Prim算法是一种贪心算法,其结果可能不是最优解,但一定是近似最优解。因此,Prim算法的时
间复杂度较高,为O(ElogE),其中E为边数。在实际应用中,Prim算法常用于求解小规模的网络最小生成树
问题。
#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
const int INF = INT_MAX;
const int MAXN = 100; // 最大顶点数
int n, m; // n为顶点数,m为边数
int dist[MAXN]; // 存储到每个顶点的距离
bool vis[MAXN]; // 标记顶点是否在生成树中
int edge[MAXN][2]; // 存储边的信息,edge[i][0]和edge[i][1]分别表示第i条边的两个顶点
// 初始化距离数组和访问数组
void init() {
for (int i = 0; i < n; i++) {
dist[i] = INF;
vis[i] = false;
}
}
// prim算法核心函数,求最小生成树
void prim() {
init(); // 初始化距离数组和访问数组