hdu 携程全球数据中心建设 (球面距离 + 最小生成树)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <algorithm> 7 using namespace std; 8 double G[110][110], sum; 9 const double pi = acos(-1); 10 const int INF = (1<<28); 11 12 struct node 13 { 14 double x, y; //x是经度, y是纬度。 15 }p[110]; 16 17 double angle(double lng1, double lat1, double lng2, double lat2) 18 { 19 double dlng = fabs(lng1-lng2)*pi/180; 20 while(dlng >= pi+pi) 21 dlng -= (pi+pi); 22 if(dlng > pi) 23 dlng = pi+pi-dlng; 24 lat1 *= pi/180; 25 lat2 *= pi/180; 26 return acos(cos(lat1)*cos(lat2)*cos(dlng)+sin(lat1)*sin(lat2)); 27 } 28 29 double sphere_dist(double r, double lng1, double lat1, double lng2, double lat2) 30 { 31 return r*angle(lng1, lat1, lng2, lat2); 32 } 33 34 void prime(int n) 35 { 36 int i, j, pos; 37 int Min, vis[110]; 38 double d[110]; 39 memset(vis, 0, sizeof(vis)); 40 memset(d, 0, sizeof(d)); 41 42 for(i = 1; i <= n; i++) 43 d[i] = G[1][i]; 44 vis[1] = 1; 45 for(i = 2; i <= n; i++) 46 { 47 Min = INF; 48 for(j = 1; j <= n; j++) 49 { 50 if(!vis[j] && Min>d[j]) 51 { 52 Min = d[j]; 53 pos = j; 54 } 55 } 56 sum += Min; 57 vis[pos] = 1; 58 for(j = 1; j <= n; j++) 59 { 60 if(!vis[j]) 61 { 62 if(d[j] > G[pos][j]) 63 d[j] = G[pos][j]; 64 } 65 } 66 } 67 } 68 int main() 69 { 70 int n, t, c, i, j; 71 double d, l, r; 72 cin>>t; 73 while(t--) 74 { 75 sum = 0; 76 cin>>d>>l>>c; 77 r = d/2*1.0; 78 n = c; 79 for(i = 1; i <= n; i++) 80 { 81 for(j = 1; j <= n; j++) 82 G[i][j] = INF; 83 G[i][i] = 0; 84 } 85 for(i = 1; i <= n; i++) 86 cin>>p[i].x>>p[i].y; 87 88 for(i = 1; i <= n; i++) 89 for(j = i+1; j <= n; j++) 90 { 91 G[i][j] = sphere_dist(r, p[i].y, p[i].x, p[j].y, p[j].x); 92 G[j][i] = G[i][j]; 93 } 94 prime(n); 95 if(sum - l> 0) 96 cout<<"N"<<endl; 97 else 98 cout<<"Y"<<endl; 99 } 100 return 0; 101 }