用c++写一个点云最小生成树
时间: 2023-07-22 19:43:59 浏览: 42
好的,我可以给你提供一个基于Prim算法的点云最小生成树的C++代码实现,如下所示:
```c++
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAXN = 1e3 + 5;
struct Point {
double x, y;
Point() : x(0), y(0) {}
Point(double x, double y) : x(x), y(y) {}
};
struct Edge {
int u, v;
double w;
Edge() : u(0), v(0), w(0) {}
Edge(int u, int v, double w) : u(u), v(v), w(w) {}
};
int n;
Point p[MAXN];
vector<Edge> e;
double dist(Point a, Point b) {
double dx = a.x - b.x, dy = a.y - b.y;
return sqrt(dx * dx + dy * dy);
}
void prim() {
bool vis[MAXN] = { false };
double d[MAXN] = { 0 };
int pre[MAXN] = { 0 };
for (int i = 2; i <= n; i++) {
d[i] = dist(p[1], p[i]);
pre[i] = 1;
}
vis[1] = true;
for (int i = 1; i < n; i++) {
int u = 0;
double min_d = 1e9;
for (int j = 2; j <= n; j++) {
if (!vis[j] && d[j] < min_d) {
u = j;
min_d = d[j];
}
}
if (u == 0) break;
vis[u] = true;
e.push_back(Edge(pre[u], u, min_d));
for (int j = 2; j <= n; j++) {
double w = dist(p[u], p[j]);
if (!vis[j] && w < d[j]) {
d[j] = w;
pre[j] = u;
}
}
}
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> p[i].x >> p[i].y;
}
prim();
double ans = 0;
for (int i = 0; i < e.size(); i++) {
ans += e[i].w;
}
cout << ans << endl;
return 0;
}
```
该代码实现了一个基于Prim算法的点云最小生成树,输入格式为点云的个数n和n个点的坐标(x, y),输出为点云的最小生成树长度。