Time limit: 3.000 seconds
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=116&page=show_problem&problem=975
纯模板题。
完整代码:
/*0.019s*/ #include<bits/stdc++.h> using namespace std; const int mx = 105; double x[mx], y[mx], dis[mx][mx]; double disTo[mx]; /// 当前的MST到点j的最短距离 bool vis[mx]; double findMST(int N) { int p, i, j; double minn, cost = 0.0; memset(vis, 0, sizeof(vis)); memcpy(disTo, dis, N * sizeof(double)); for (i = 1; i < N; ++i) { minn = DBL_MAX; for (j = 1; j < N; ++j) if (!vis[j] && disTo[j] < minn) p = j, minn = disTo[j]; /// 找到一条横切边 vis[p] = true; /// 将横切边加到MST中 cost += sqrt(minn); for (j = 1; j < N; ++j) if (!vis[j] && dis[p][j] < disTo[j]) disTo[j] = dis[p][j]; /// 更新当前的MST到点j的最短距离 } return cost; } int main() { int T, i, j, N; scanf("%d", &T); while (T--) { scanf("%d", &N); for (i = 0; i < N; ++i) scanf("%lf%lf", &x[i], &y[i]); for (i = 0; i < N; ++i) for (j = 0; j < i; ++j) dis[j][i] = dis[i][j] = (x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]); printf("%.2f\n", findMST(N)); if (T) putchar(10); } return 0; }