请为我提供一个水准网间接平差的程序设计的C++代码
时间: 2024-03-24 18:40:44 浏览: 115
水准网间接平差程序设计(c++).doc
以下是一个水准网间接平差程序的C++实现,与前面的C语言实现相似:
```c++
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAXN = 1000; // 最大点数
const int MAXM = 10000; // 最大观测数
const double INF = 1e20; // 无穷大
int n, m; // 点数,观测数
double a[MAXN]; // 点高程值
int u[MAXM], v[MAXM]; // 观测的两个点编号
double l[MAXM], c[MAXM]; // 观测的高程差、权值
int p[MAXN]; // 并查集数组,用于判断两个点是否连通
struct Edge { // 边结构体
int u, v; // 边的两个端点
double w; // 边的权值(即改正数)
} edge[MAXM];
bool cmp(Edge a, Edge b) { // 边按权值从小到大排序
return a.w < b.w;
}
int find(int x) { // 并查集查找
return p[x] == x ? x : p[x] = find(p[x]);
}
void kruskal() { // Kruskal算法
int i, cnt = 0;
double ans = 0;
for (i = 1; i <= n; i++) p[i] = i;
sort(edge, edge + m, cmp);
for (i = 0; i < m; i++) {
int u = edge[i].u, v = edge[i].v;
double w = edge[i].w;
int pu = find(u), pv = find(v);
if (pu != pv) { // 如果不连通,则加入边
ans += w;
p[pu] = pv;
cnt++;
if (cnt == n - 1) break;
}
}
printf("单位权中误差: %.4lf\n", sqrt(ans / (n - 1)));
}
int main() {
int i;
scanf("%d%d", &n, &m);
for (i = 1; i <= n; i++) scanf("%lf", &a[i]);
for (i = 0; i < m; i++) {
scanf("%d%d%lf%lf", &u[i], &v[i], &l[i], &c[i]);
edge[i].u = u[i];
edge[i].v = v[i];
edge[i].w = (a[u[i]] - a[v[i]]) - l[i];
edge[i].w /= c[i];
}
kruskal();
return 0;
}
```
该程序中使用了C++标准库中的sort函数进行边的排序,以及printf函数进行输出。
阅读全文