• UVA 10034 Freckles


    UVA_10034

        首先根据点的坐标把所有边构造出来,然后直接用Kruskal算法求出最小生成树即可。具体思想可以参考刘汝佳白书的P201

    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<stdlib.h>
    double x[110],y[110],w[10010];
    int u[10010],v[10010],p[110],r[10010];
    int cmp(const void *_p,const void *_q)
    {
    int *p=(int *)_p;
    int *q=(int *)_q;
    return w[*p]>w[*q]?1:-1;
    }
    int find(int x)
    {
    return p[x]==x?x:(p[x]=find(p[x]));
    }
    double distance(int i,int j)
    {
    return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
    }
    int main()
    {
    int i,j,k,n,t,e,tx,ty;
    double ans;
    scanf("%d",&t);
    while(t--)
    {
    scanf("%d",&n);
    for(i=0;i<n;i++)
    scanf("%lf%lf",&x[i],&y[i]);
    e=0;
    for(i=0;i<n;i++)
    for(j=i+1;j<n;j++)
    {
    u[e]=i;
    v[e]=j;
    w[e]=distance(i,j);
    e++;
    }
    for(i=0;i<n;i++)
    p[i]=i;
    for(i=0;i<e;i++)
    r[i]=i;
    qsort(r,e,sizeof(r[0]),cmp);
    ans=0.0;
    for(i=0;i<e;i++)
    {
    tx=find(u[r[i]]);
    ty=find(v[r[i]]);
    if(tx!=ty)
    {
    p[tx]=ty;
    ans+=w[r[i]];
    }
    }
    printf("%.2f\n",ans);
    if(t)
    printf("\n");
    }
    return 0;
    }


  • 相关阅读:
    (转)C#中String跟string的“区别”
    C#中的this关键字
    (转)VS2015基础 指定一个或多个项目执行
    C# 中如何输出双引号(转义字符的使用)
    (转) C#中使用throw和throw ex抛出异常的区别
    springboot
    Zookeeper
    Maven
    springboot
    springboot
  • 原文地址:https://www.cnblogs.com/staginner/p/2195605.html
Copyright © 2020-2023  润新知