请为我提供一个水准网间接平差的程序设计的C
时间: 2024-03-24 18:40:44 浏览: 62
C#水准网间接平差.zip
5星 · 资源好评率100%
以下是一个简单的水准网间接平差程序的C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAXN 1000 // 最大点数
#define MAXM 10000 // 最大观测数
#define 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];
int cmp(const void* a, const void* b) { // 边按权值从小到大排序
return (*(Edge*)a).w < (*(Edge*)b).w ? -1 : 1;
}
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;
qsort(edge, m, sizeof(Edge), 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;
}
```
该程序中使用了Kruskal算法进行最小生成树的构建,其中涉及到了并查集的操作。程序中的单位权中误差是根据最小生成树的权值计算得到的。
阅读全文