zoukankan      html  css  js  c++  java
  • 畅通工程再续

    这题竟然出错在了快排上,对double类型的数据排序,

    return a>b?1:-1;

    如果还是减的话则会造成数据丢失

    http://acm.hdu.edu.cn/showproblem.php?pid=1875

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <math.h>
    using namespace std;
    int n,tt;
    int tx[102],ty[102];
    struct node
    {
        int x,y;
        double w;
    }edge[101*100/2+1];
    int bin[102];
    void add(int u,int v,double w1)
    {
        edge[tt].x=u;
        edge[tt].y=v;
        edge[tt].w=w1;
        tt++;
    }
    int cmp(const void *a,const void *b)
    {
        return (*(struct node *)a).w>(*(struct node *)b).w?1:-1;
    }
    int findx(int x)
    {
        int r=x;
        while(r!=bin[r])
            r=bin[r];
        int j,k;
        j=x;
        while(j!=r)
        {
            k=bin[j];
            bin[j]=r;
            j=k;
        }
        return r;
    }
    void merge(int x,int y)
    {
        int fx=findx(x);
        int fy=findx(y);
        if(fx!=fy)
            bin[fx]=fy;
    }
    void Kuscal()
    {
        double sum=0;
        int ll=1;//最小生成树n-1条边
        int i=0;
        while(ll<n&&i<tt)
        {
            if(ll==n) break;
            if(findx(edge[i].x)!=findx(edge[i].y))
            {
                merge(findx(edge[i].x),findx(edge[i].y));
                sum=sum+edge[i].w;
                ll++;
            }
            i++;
        }
        if(ll==n)
        printf("%.1lf
    ",sum);
        else printf("oh!
    ");
    
    }
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d",&n);
            tt=0;
            for(int i=1;i<=n;i++)
                bin[i]=i;
           for(int i=1;i<=n;i++)
            {
                scanf("%d%d",&tx[i],&ty[i]);
            }
            double r;
            for(int i=1;i<=n;i++)
            {
                for(int j=i+1;j<=n;j++)
                {
                    r=sqrt(pow(tx[i]-tx[j],2)+pow(ty[i]-ty[j],2));
                    if(r>=10&&r<=1000)
                        add(i,j,r*100);
                }
            }
            qsort(edge,tt,sizeof(edge[0]),cmp);
           Kuscal();
        }
        return 0;
    }
    

     

  • 相关阅读:
    重定向syste.out.print
    文件与文件夹的拷贝
    List和Set转Long数组
    Struts2验证错误信息的两个经典方法-addFieldError&addActionError
    OA项目---笔记
    三种给<s:a>,<a>标签传值的方式
    [整理]免费电子书网站
    [整理]Visual Studio 的Application Insights
    [转载]CSS Tools: Reset CSS
    [转载]AngularJS之Factory vs Service vs Provider
  • 原文地址:https://www.cnblogs.com/zhangmingcheng/p/3809593.html
Copyright © 2011-2022 走看看