题目链接。
代码如下:
#include <stdio.h> #include <stdlib.h> #include <math.h> const double INF = (1<<25); #define MAXN 103 #define MAXM 10010 struct Pos{ int x, y; }pos[MAXN]; int vis[MAXN]; double G[MAXN][MAXN], d[MAXN], ans; double calc(struct Pos a, struct Pos b){ int k = (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y); if(k<100 || k>1000000) return INF; else return sqrt(k*1.0); } int prim(int n){ int i, x, y, flag; double m; for(i=0; i<n; i++){ d[i] = G[0][i]; } vis[0] = 1; d[0] = 0; for(i=0; i<n-1; i++){ m = INF*1.0; flag = 0; for(y=0; y<n; y++)if(!vis[y] && m > d[y]) {m = d[x=y]; flag = 1;} if(!flag) break; vis[x] = 1; ans += m; for(y=0; y<n; y++)if(!vis[y] && d[y]>G[x][y]) d[y] = G[x][y]; } return flag; } int main(){ int n, i, j, T; scanf("%d", &T); while(T--){ scanf("%d", &n); ans = 0.0; for(i=0; i<n; i++){ scanf("%d %d", &pos[i].x, &pos[i].y); vis[i] = 0; } for(i=0; i<n; i++){ for(j=0; j<=i; j++){ if(j==i) G[i][j] = INF; else G[i][j] = G[j][i] = calc(pos[i], pos[j]); } } if(prim(n)) printf("%.1lf\n", ans*100); else printf("oh!\n"); } return 0; }