首页 > 代码库 > 畅通工程再续

畅通工程再续

这题竟然出错在了快排上,对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\n",sum);    else printf("oh!\n");}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;}