#include \n#include \n#include \n#include \n\n// 定义点结构体\nstruct Point {\n double x, y, z;\n};\n\n// 定义边结构体\nstruct Edge {\n int src, dest;\n double weight;\n};\n\n// 比较边的权重\nbool compareWeight(Edge a, Edge b) {\n return a.weight < b.weight;\n}\n\n// 查找节点的根节点\nint findRoot(std::vector& parent, int i) {\n while (parent[i] != i) {\n parent[i] = parent[parent[i]]; // 路径压缩\n i = parent[i];\n }\n return i;\n}\n\n// 使用Kruskal算法生成最小生成树\nstd::vector kruskalMST(std::vector points, std::vector edges) {\n std::vector result;\n std::vector parent(points.size());\n\n // 初始化parent数组\n for (int i = 0; i < points.size(); i++) {\n parent[i] = i;\n }\n\n // 按权重对边进行排序\n std::sort(edges.begin(), edges.end(), compareWeight);\n\n int edgeCount = 0;\n int i = 0;\n\n while (edgeCount < points.size() - 1 && i < edges.size()) {\n // 获取边的起点和终点\n int srcRoot = findRoot(parent, edges[i].src);\n int destRoot = findRoot(parent, edges[i].dest);\n\n // 如果起点和终点不在同一个连通分量中,则添加边到结果中\n if (srcRoot != destRoot) {\n result.push_back(edges[i]);\n parent[srcRoot] = destRoot;\n edgeCount++;\n }\n i++;\n }\n\n return result;\n}\n\nint main() {\n std::ifstream file("point_cloud.ply");\n\n std::vector points;\n std::vector edges;\n\n std::string line;\n bool readVertices = false;\n while (std::getline(file, line)) {\n if (line == "end_header") {\n readVertices = true;\n continue;\n }\n\n if (readVertices) {\n Point point;\n std::stringstream ss(line);\n ss >> point.x >> point.y >> point.z;\n points.push_back(point);\n }\n }\n\n // 构建点之间的所有边\n for (int i = 0; i < points.size() - 1; i++) {\n for (int j = i + 1; j < points.size(); j++) {\n Edge edge;\n edge.src = i;\n edge.dest = j;\n edge.weight = sqrt(pow(points[i].x - points[j].x, 2) + pow(points[i].y - points[j].y, 2) + pow(points[i].z - points[j].z, 2));\n edges.push_back(edge);\n }\n }\n\n std::vector minSpanningTree = kruskalMST(points, edges);\n\n // 输出最小生成树的边\n for (auto edge : minSpanningTree) {\n std::cout << edge.src << " - " << edge.dest << std::endl;\n }\n\n return 0;\n}\n