// 使用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]; // 更新键值 } }

注释代码stdvectorint parentcloud-size -1;	stdvectorfloat keycloud-size stdnumeric_limitsfloatmax;	stdvectorbool visitedcloud-size false;	key0 = 0;	parent0 = -1;	for size_t i = 0; i cloud-size - 1; ++i

原文地址: https://www.cveoy.top/t/topic/eCRK 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录