玲珑学院OJ 1000 Spoon Devil's 3-D Matrix

来源:互联网 发布:ac尼尔森数据 编辑:程序博客网 时间:2024/04/25 19:37

【题目链接】http://www.ifrog.cc/acm/problem/1000

【解题方法】裸的最小生成树。

【AC 代码】

////Created by just_sort 2016/9/25 13:42//Copyright (c) 2016 just_sort.All Rights Reserved//#include <set>#include <map>#include <queue>#include <stack>#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>using namespace std;typedef long long LL;const double inf = 1e18;int n;double g[55][55];double dis[55];bool vis[55];struct Point{    double x,y,z;    void read(){        scanf("%lf%lf%lf",&x,&y,&z);    }}p[55];double getdis(Point a,Point b){    return  sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z));}int main(){    int T;    scanf("%d",&T);    while(T--){        scanf("%d",&n);        for(int i=1; i<=n; i++) p[i].read();        for(int i=1; i<=n; i++) dis[i] = inf;        for(int i=1; i<=n; i++) vis[i] = false;        for(int i=1; i<=n; i++){            for(int j=1; j<=n; j++){                if(i==j) g[i][j] = inf;                else g[i][j] = getdis(p[i],p[j]);            }        }        double ans = 0;        dis[1] = 0;        for(int i=1; i<=n; i++){            int mark;double minn=inf;            for(int j=1; j<=n; j++){                if(!vis[j] && dis[j]<minn){                    minn = dis[j];                    mark = j;                }            }            vis[mark] = 1;            ans += dis[mark];            for(int j=1; j<=n; j++){                if(!vis[j] && g[mark][j]<dis[j]){                    dis[j] = g[mark][j];                }            }        }        printf("%.2f\n",ans);    }    return 0;}


0 0
原创粉丝点击