Prime_poj2031 Building a Space Station

原创 2012年03月26日 14:49:11

题目意思很简单,就是给出一些点,让你搭建通路,使得他们能够相互连通起来,就是把他们连接成一颗树,其中每个点都是一个球,如果两个球有重叠的部分则算为连通。让我们求搭建通路的最小费用(费用和通路长度成正比)。

显然这个是个最小生成树的问题,用那种都行,我用的是Prim算法


/*
Sample Input

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
Sample Output

20.000
0.000
73.834
*/
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<vector>

#define MAXN 110
#define INF 1000000000
using namespace std;

typedef struct{
    double x, y, z, r;
}sphere;

typedef struct{
    int u, v;
}Edge;

sphere qiuti[MAXN];
double map[MAXN][MAXN];
int visited[MAXN];

vector<int> usedPoint;
vector<Edge> usedEdge;

double cal_dis(sphere &s1, sphere &s2){
    double a = s1.x - s2.x;
    double b = s1.y - s2.y;
    double c = s1.z - s2.z;
    return sqrt(a*a + b*b +c*c) - s1.r - s2.r;
}
double prim(int n){
    memset(visited,0, sizeof(visited));
    usedPoint.clear();
    usedEdge.clear();
    int iflag, jflag,count;
    double minv = INF;
    usedPoint.push_back(0);
    visited[0] = 1; count = 1;
    while(count++ < n){
        minv = INF;
        for(int i = 0; i < usedPoint.size(); i++){
            int tmp = usedPoint[i];
            for(int j = 0; j < n; j++){
                if(!visited[j] && map[tmp][j] < minv){
                    minv = map[tmp][j];
                    iflag = tmp;
                    jflag = j;
                }
            }
        }
        Edge e;
        e.u = iflag;
        e.v = jflag;
        usedPoint.push_back(jflag);
        usedEdge.push_back(e);
        visited[jflag] = 1;
    }

    double sum = 0;
    for(int i = 0; i < usedEdge.size(); i++){
        sum+=map[usedEdge[i].u][usedEdge[i].v];
    }
    return sum;
}
int main(){
    int n;
    while(scanf("%d", &n),n){
        for(int i = 0; i < n; i++){
            scanf("%lf%lf%lf%lf", &qiuti[i].x, &qiuti[i].y, &qiuti[i].z, &qiuti[i].r);
        }
        for(int i = 0; i < n; i++){
            for(int j = i; j< n; j++){
                double dis = cal_dis(qiuti[i], qiuti[j]);
                map[i][j] = map[j][i] = dis > 0 ? dis : 0;
            }
        }
        double len = prim(n);
        printf("%.3f\n", len);
    }
    return 0;
}


相关文章推荐

poj2031Building a Space Station【空间坐标距离+prime】

Language: Default Building a Space Station Time Limit: 1000MS   Memory Limit: 30000K Total Sub...

poj2031-Building a Space Station(最小生成树,kruskal,prime)

Building a Space Station Time Limit: 1000MS   Memory Limit: 30000K Total Submissions...
  • nvliba
  • nvliba
  • 2015年08月24日 10:02
  • 536

ZOJ 1718 POJ 2031 Building a Space Station 修建空间站 最小生成树 Kruskal算法

首先求出所有的单间两两是否接触如果接触,说明他们之间的边长为0,不接触那么就是圆心的距离减去两个单间的半径。然后构图求最小生成树,采用Kruskal算法。...

poj 2031 Building a Space Station

最小生成树的题目,prim搞一搞就可以了。 /* * Author: stormdpzh * Time: 2012/5/10 11:09:57 */ #include #include #...

<模板>poj2031 Building a Space Station(最小生成树)

题目链接:http://openoj.awaysoft.com:8080/judge/contest/view.action?cid=384#problem/D #include #includ...
  • modiz
  • modiz
  • 2013年05月09日 14:26
  • 486

poj2031 - Building a Space Station

想看更多的解题报告: http://blog.csdn.net/wangjian8006/article/details/7870410                               ...

Poj 2031 Building a space station

题目描述: 你是空间站工程队的一员,你被分配到建设空间站的任务中。你希望编写一个程序完成这个 任务。 空间站由许多单元组成,这些单元被称为单间。所有的单间都是球形的,但是大小不必一致。 在空间...

Building a Space Station 【poj-2031】【最小生成树】

Building a Space Station Time Limit: 1000MS   Memory Limit: 30000K Total Submissions...

【POJ】 2031 Building a Space Station

Building a Space Station Time Limit: 1000MS   Memory Limit: 30000K Total Submissions...
  • S_Black
  • S_Black
  • 2016年01月11日 19:07
  • 206
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Prime_poj2031 Building a Space Station
举报原因:
原因补充:

(最多只允许输入30个字)