The data size of this question is large, and the common request for MST will time out.
D [I] = cost [I]-ans * Dis [0] [I]
This is based on two points.
But it is better to use dinkelbach for iteration.
# Include <cstdio> # include <cstring> # include <cmath> # include <iostream> # include <algorithm> using namespace STD; # define n 1010 double MP [N] [N], C [N] [N], X [N], Y [N], Z [N], E [N] [N], d [N]; int vis [N], n; inline double prim (double mid) {double TMP, ANS = 0; for (INT I = 0; I <n; I ++) {vis [I] = 0; For (Int J = 0; j <I; j ++) E [I] [J] = E [J] [I] = C [I] [J]-mid * MP [I] [J];} for (INT I = 1; I <n; I ++) d [I] = E [0] [I]; d [0] = 0; vis [0] = 1; for (INT I = 1; I <n; I ++) {Int P; TMP = 100000000; For (Int J = 0; j <n; j ++) {If (! Vis [J] & D [J] <TMP) {P = J; TMP = d [J] ;}} ans + = TMP; vis [p] = 1; for (Int J = 0; j <n; j ++) {If (! Vis [J] & E [J] [p] <D [J]) d [J] = E [J] [p] ;}} return ans ;} int main () {int I, j; double le, RI, mid; while (scanf ("% d", & N) {for (I = 0; I <n; I ++) scanf ("% lf", & X [I], & Y [I], & Z [I]); for (I = 0; I <n; I ++) for (j = 0; j <I; j ++) {MP [I] [J] = MP [J] [I] = SQRT (X [I]-X [J]) * (X [I]-X [J]) + (Y [I]-y [J]) * (Y [I]-y [J]); c [I] [J] = C [J] [I] = Z [I]> Z [J]? Z [I]-Z [J]: Z [J]-Z [I];} Le = 0; rI = 1001; // unhappy .. In this way, the while (ri-Le> 1e-5) {mid = (le + Ri)/2.0; // printf ("prim: % lf \ n", Prim (0, mid); If (prim (MID)> 0) Le = mid; else rI = mid;} printf ("%. 3f \ n ", mid);} return 0 ;}