zoukankan      html  css  js  c++  java
  • HDU 1875(最小生成树)

    因为是全连接图,所以也可以用最小生成树

    这道题给边加了一个限制条件,(10<=x<=1000),所以可能不能全连通,需要判断

    #include <cstdio>
    #include <iostream>
    #include <queue>
    #include <cmath>
    using namespace std;
    
    #define sf scanf
    #define pf printf
    #define debug printf("!
    ")
    #define blank printf("
    ")
    #define mem(a,b) memset(a,b,sizeof(a))
    
    const int MaxN = 110;
    const int INF = 1<<27;
    
    int p[MaxN];
    
    int r[MaxN*MaxN],u[MaxN*MaxN],v[MaxN*MaxN];
    double w[MaxN*MaxN];
    
    int m,n,vex;
    
    struct point
    {
        int x,y;
    };
    
    point pt[110];
    
    int find(int x){return p[x]==x?x:p[x]=find(p[x]);}
    
    
    int cmp(const int a,const int b)
    {
        return w[a]<w[b];
    }
    
    double kruskal()
    {
        double ans = 0;
        int i;
    
        for(i = 0;i<n;i++) p[i] = i;
        for(i = 0;i<m;i++) r[i] = i;
        
        sort(r,r+m,cmp);
    
        for(i = 0;i<m;i++)
        {
            int e = r[i];
            int x = find(u[e]);
            int y = find(v[e]);
            if(x!=y)
            {
                ans+=w[e];
                p[x] = y;
                vex++;
            }
        }
        return ans;
    }
    
    double getD(point p1 ,point p2)
    {
        return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
    }
    
    
    int main()
    {
        int i,j,t;
        sf("%d",&t);
        while(t--)
        {
            mem(u,0);
            mem(v,0);
            mem(w,0);
    
            m=0;
            vex = 1;
            
            sf("%d",&n);
            for(i = 0;i<n;i++)
            {
                sf("%d%d",&pt[i].x,&pt[i].y);
            }
    
            for(i = 0;i<n;i++)
            {
                for(j=i+1;j<n;j++)
                {
                    double d = getD(pt[i],pt[j]);
                    if(d<10 || d>1000)
                    {
                        continue;
                    }
                    u[m] = i;
                    v[m] = j;
                    w[m++] = d;
                }
            }
    
            double ans = kruskal();
    
            if(vex<n)
                pf("oh!
    ");
            else
                pf("%.1lf
    ",ans*100);
        }
    
        return 0;
    }
  • 相关阅读:
    linux内核编译步骤
    Linux strace命令
    通过Wifi调试Android应用
    [Java 7][msvcr100.dll] Error when load Eclipse
    Cobar 关系型数据的分布式处理系统
    升级SUSE Linux内核的完整步骤!
    Qt 5.7 亮瞎眼的更新
    QT5.11下载与安装教程
    Delphi 对象模型学习笔记(转)
    内存共享【Delphi版】
  • 原文地址:https://www.cnblogs.com/qlky/p/5154809.html
Copyright © 2011-2022 走看看