http://acm.hdu.edu.cn/showproblem.php?pid=1875
把已知的坐标转化为点与点的距离保存到maps里;
#include<stdio.h> #include<string.h> #include<map> #include<iostream> #include<algorithm> #include<math.h> #define N 110 #define INF 0xfffffff using namespace std; int vis[N], n; double maps[N][N],dist[N]; struct node { int x,y; }a[N]; void Init() { for(int i=0; i<=n; i++) { vis[i] = 0; dist[i] = INF; for(int j=0; j<=n; j++) { maps[i][j] = INF; } } memset(a,0,sizeof(a)); } double Prim(int start) { double ans = 0; for(int i=1; i<=n; i++) dist[i] = maps[start][i]; vis[start] = 1; for(int i=1; i<n; i++) { double Min = INF; int index = -1; for(int j=1; j<=n; j++) { if(vis[j]==0 && Min > dist[j]) Min = dist[j], index = j; } if(index == -1) break; vis[index] = 1; ans += Min; for(int j=1; j<=n; j++) { if(vis[j]==0 && dist[j] > maps[index][j]) { dist[j] = maps[index][j]; } } } return ans; } int main() { int i, j, T; double ans; scanf("%d", &T); while(T--) { scanf("%d", &n); Init(); for(i=1; i<=n; i++) scanf("%d%d", &a[i].x, &a[i].y); for(i=1; i<=n; i++) { for( j=1; j<i; j++) { int d=(a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y); if(d>=100 && d<=1000000) maps[i][j] = maps[j][i] = sqrt(d); } } ans = Prim(1); if(ans == 0) printf("oh! "); else printf("%.1lf ", ans*100); } return 0; }