// 使用Prim算法求解最小生成树
std::vector parent(cloud->size(), -1); // 存储每个顶点在最小生成树上的父节点
std::vector key(cloud->size(), std::numeric_limits::max()); // 存储每个顶点的键值,初始值为最大值
std::vector visited(cloud->size(), false); // 存储每个顶点是否已被访问,初始值为false
key[0] = 0; // 选定0号顶点为起点,键值为0,父节点为-1
parent[0] = -1;
// 进行n-1次循环,每次将一个顶点加入最小生成树
for (size_t i = 0; i < cloud->size() - 1; ++i)
{
float min_key = std::numeric_limits::max(); // 初始化最小键值为最大值
int min_index = -1; // 初始化最小键值所对应的顶点编号为-1
// 在未访问的顶点中选取键值最小的顶点
for (size_t j = 0; j < cloud->size(); ++j)
{
if (!visited[j] && key[j] < min_key)
{
min_key = key[j];
min_index = j;
}
}
visited[min_index] = true; // 将选定的顶点标记为已访问
// 更新与选定顶点相邻的未访问顶点的键值和父节点
for (size_t j = 0; j < cloud->size(); ++j)
{
if (!visited[j] && distances[min_index][j] < key[j])
{
parent[j] = min_index; // 更新父节点
key[j] = distances[min_index][j]; // 更新键值
}
}