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;
}


ROS_catkin创建工作空间_官网资料整理

Create a ROS Workspace Let's create a catkin workspace: $ mkdir -p ~/catkin_ws/src $ cd ~/catki...
  • hanshuning
  • hanshuning
  • 2015年11月26日 17:22
  • 1158

LeetCode Gas Station 两个特性,两种方法完美解答-更新证明方法

我觉得做这道题的关键是要可以总结出来这道题目的属性,注意Note这个地方,其属性主要有两个: 1 如果总的gas - cost小于零的话,那么没有解返回-1 2 如果前面所有的gas - cost...
  • kenden23
  • kenden23
  • 2013年11月03日 17:07
  • 18156

杭电ACM1008电梯问题C++

/* 时间:2012.03.17 作者:烟大洋仔 题目: Problem Description The highest building in our city has only one...
  • wangyang1354
  • wangyang1354
  • 2013年03月17日 16:07
  • 5621

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
  • 577

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

Language: Default Building a Space Station Time Limit: 1000MS   Memory Limit: 30000K Total Sub...
  • R1986799047
  • R1986799047
  • 2015年09月05日 21:53
  • 283

POJ2031-Building a Space Station【Prim+计算几何】

  • 2011年07月31日 23:14
  • 9KB
  • 下载

POJ2031,Building a Space Station,最小生成树模版题

这道题其实就是最小生成树模版题,关键是要把题意读懂 解释一下题意(看题不用被题面所吓到,题目长不一定难!而且慢慢翻译文章也是一种乐趣! 空间里有很多球型的单位,它们的半径不一定都是一样的,要让它们...
  • In_Youth
  • In_Youth
  • 2015年07月27日 09:58
  • 216

POJ 2031 Building a Space Station(最小生成树)

POJ 2031 Building a Space Station(最小生成树) http://poj.org/problem?id=2031 题意:        有n个三维的球体,对于每个球体给出...
  • u013480600
  • u013480600
  • 2014年07月19日 18:57
  • 712

POJ 2031 Building a Space Station(Kruskal算法)

Building a Space Station Time Limit: 1000MS   Memory Limit: 30000K Total Submissions...
  • qiyazhuang
  • qiyazhuang
  • 2011年09月15日 19:54
  • 384

poj2031 Building a Space Station 三维空间的最小生成树

题目链接: 2031 http://write.blog.csdn.net/postedit?ref=toolbar 题意: 在三维空间中有N个球形空间站,给出每个...
  • AXuan_K
  • AXuan_K
  • 2015年01月23日 15:48
  • 935
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Prime_poj2031 Building a Space Station
举报原因:
原因补充:

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