Lonlife 1000 - Spoon Devil's 3-D Matrix

来源:互联网 发布:学算法看什么书 编辑:程序博客网 时间:2024/04/26 06:54
1000 - Spoon Devil's 3-D Matrix

Time Limit:1s Memory Limit:32MByte

Submissions:208Solved:65

DESCRIPTION

Spoon Devil build a 3-D matrix, and he(or she) wants to know if he builds some bases what's the shortest distance to connect all of them.

INPUT
There are multiple test cases. The first line of input contains an integerT
, indicating the number of test cases. For each test case:The first line contains one integern (0<n<50), indicating the number of all points. Then the next n lines, each lines contains three numbers xi,yi,zi indicating the position of i
-th point.
OUTPUT
For each test case, output a line, which should accurately rounded to two decimals.
SAMPLE INPUT
221 1 02 2 031 2 30 0 01 1 1
SAMPLE OUTPUT
1.413.97
SOLUTION
“玲珑杯”acm比赛-试运行赛


思路:

三维点的MST(Krusal)

#include<iostream>#include<cmath>#include<string>#include<cstring>#include<cstdlib>#include<algorithm>using namespace std;const int MAXN=55;const int MAXM=1200;int pre[MAXN];struct node{    double x,y,z;    node()    {        x=y=z=0;    }}Node[MAXN];struct edge{    int s,e;    double d;    edge()    {        s=e=d=0;    }}Edge[MAXM];bool cmp(edge a, edge b){    return a.d<b.d;}int father(int x){    if(pre[x]==x)        return x;    else    {        pre[x]=father(pre[x]);        return pre[x];    }}double krusal(int n){    double cost=0;    for(int i=0;i<MAXN;i++)pre[i]=i;    int cnt=0;    int index=0;    while(cnt<n-1)    {        int ps=father(Edge[index].s);        int pe=father(Edge[index].e);        if(ps!=pe)        {            pre[ps]=pe;            cost+=Edge[index].d;            cnt++;        }        index++;    }    return cost;}int main(){    int t;    scanf("%d",&t);    while(t--)    {        int n;        scanf("%d",&n);        for(int i=0;i<n;i++)        {            scanf("%lf%lf%lf",&Node[i].x,&Node[i].y,&Node[i].z);        }        int cnt=0;        for(int i=0;i<n;i++)        {            for(int j=i+1;j<n;j++)            {                Edge[cnt].s=i;Edge[cnt].e=j;                Edge[cnt].d=sqrt(pow(fabs(Node[i].x-Node[j].x),2.0)+pow(fabs(Node[i].y-Node[j].y),2.0)+pow(fabs(Node[i].z-Node[j].z),2.0));                cnt++;            }        }        sort(Edge,Edge+cnt,cmp);        printf("%.2lf\n",krusal(n));    }    return 0;}


1 0