作业四1002

来源:互联网 发布:java部分中文乱码 编辑:程序博客网 时间:2024/06/03 21:19

题意:给一个数n,接着是n各点的坐标;求连接这n个点的连线的最小距离。

思路:并查集。用到find函数,merge函数,以及sqrt,还是图算法;

收获:练习了这个方法,喝上一道题不同的是这道题给出的是点的坐标。

感悟:不知道为什么老是超时,所以不是很开心。

超时代码:

#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>using namespace std;int bin[110];struct node{int s;int e;double d;}p[10001];int find(int x){    int r=x;    while(bin[r]!=r)        r=bin[r];    return r;}int merge(int x,int y){    int fx,fy;    fx=find(x);    fy=find(y);    if(fx!=fy){        bin[fx]=fy;        return 1;    }    return 0;}int cmp(node x,node y){        return x.d<y.d;}int main(){    int n,i,j;    double x[110],y[110],s;   while(scanf("%d",&n),n);{for(i=1;i<=110;i++)            bin[i]=i;        for(i=1;i<=n;i++)            scanf("%lf%lf",&x[i],&y[i]);            int k=1;            for(i=1;i<=n;i++)                for(j=i+1;j<=n;j++)            {                p[k].s=i;                p[k].e=j;                p[k].d=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));                k++;            }            sort(p,p+k,cmp);            s=0.00;            for(i=1;i<=k;i++)                if(merge(p[i].s,p[i].e))            {                s+=p[i].d;            }            printf("%.2lf\n",s);}    return 0;}

AC :
#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>using namespace std;struct node{    int start;    int end;    double dis;}t[10010];int cmp(node a,node b){    return a.dis <b.dis ;}int per[110];int find(int x){    int r=x;    while(r!=per[r])    r=per[r];    return r;}int join(int x,int y){    int fx=find(x);    int fy=find(y);    if(fx!=fy)    {        per[fx]=fy;        return 1;    }    return 0;}int main(){    int m,n,i,j,p;    double x[110],y[110];    while(scanf("%d",&n)!=EOF)    {        for(i=0;i<110;i++)        per[i]=i;        for(i=0;i<n;i++)        scanf("%lf%lf",&x[i],&y[i]);        int k=0;        for(i=0;i<n;i++)        for(j=i+1;j<n;j++)        {            t[k].start=i;            t[k].end =j;            t[k].dis =sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));            k++;        }        sort(t,t+k,cmp);        double sum=0.00;        for(i=0;i<k;i++)        if(join(t[i].start,t[i].end))        sum=sum+t[i].dis;        printf("%.2lf\n",sum);    }    return 0;}
实在是找不出错误!!!!!!!!!!!

0 0
原创粉丝点击