标签:
3 10.000 10.000 50.000 10.000 40.000 10.000 50.000 10.000 40.000 40.000 50.000 10.000 2 30.000 30.000 30.000 20.000 40.000 40.000 40.000 20.000 5 5.729 15.143 3.996 25.837 6.013 14.372 4.818 10.671 80.115 63.292 84.477 15.120 64.095 80.924 70.029 14.881 39.472 85.116 71.369 5.553 0
20.000 0.000 73.834
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 #include <cmath> 6 #define INF 0x3f3f3f3f 7 #define pii pair<double,int> 8 using namespace std; 9 const int maxn = 110; 10 struct arc{ 11 int to,next; 12 double cost; 13 arc(int x = 0,double y = 0,int z = -1){ 14 to = x; 15 cost = y; 16 next = z; 17 } 18 }e[maxn*maxn]; 19 int head[maxn],n,tot; 20 double x[maxn],y[maxn],z[maxn],r[maxn],d[maxn]; 21 bool done[maxn]; 22 void add(int u,int v,double w){ 23 e[tot] = arc(v,w,head[u]); 24 head[u] = tot++; 25 } 26 double getDis(int a,int b){ 27 double tmp = (x[a]-x[b])*(x[a]-x[b]); 28 tmp += (y[a] - y[b])*(y[a] - y[b]); 29 tmp += (z[a] - z[b])*(z[a] - z[b]); 30 tmp = sqrt(tmp); 31 return r[a]+r[b] >= tmp?0.0:tmp-r[a]-r[b]; 32 } 33 double prim(){ 34 double ans = 0; 35 for(int i = 0; i < maxn; ++i){ 36 d[i] = INF; 37 done[i] = false; 38 } 39 priority_queue< pii,vector< pii >,greater< pii > >q; 40 q.push(make_pair(d[0] = 0,0)); 41 while(!q.empty()){ 42 int u = q.top().second; 43 q.pop(); 44 if(done[u]) continue; 45 done[u] = true; 46 ans += d[u]; 47 for(int i = head[u]; ~i; i = e[i].next){ 48 if(d[e[i].to] > e[i].cost) 49 q.push(make_pair(d[e[i].to] = e[i].cost,e[i].to)); 50 } 51 } 52 return ans; 53 } 54 int main(){ 55 while(scanf("%d",&n),n){ 56 memset(head,-1,sizeof(head)); 57 for(int i = tot = 0; i < n; ++i){ 58 scanf("%lf %lf %lf %lf",x+i,y+i,z+i,r+i); 59 } 60 for(int i = 0; i < n; ++i){ 61 for(int j = 0; j < n; ++j){ 62 if(i == j) continue; 63 add(i,j,getDis(i,j)); 64 } 65 } 66 printf("%.3f\n",prim()); 67 } 68 return 0; 69 }
POJ 2031 Building a Space Station
标签:
原文地址:http://www.cnblogs.com/crackpotisback/p/4333803.html