POJ 2560 Freckles------最小生成树(水啊)

来源:互联网 发布:遗传算法 应用 编辑:程序博客网 时间:2024/06/05 17:06

没啥说的,计算点之间的距离,然后 最小生成树。。


#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>int parent[101];int root(int p){    if(parent[p]==-1) return p;    else return parent[p]=root(parent[p]);}void merge(int a,int b){    a=root(a);    b=root(b);    parent[a]=b;}struct pos{    int a,b;    double len;}p[5050];struct dian{    double x,y;}di[101];int comp(const void *a,const void *b){    if((((struct pos *)a)->len)-(((struct pos *)b)->len)>0)        return 1;    else  return -1;}double dis(struct dian a,struct dian b){    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}int main(){    int i,j,k;    int n,a,b,c,q;    while(scanf("%d",&n)!=EOF)    {        int flag=0;        memset(parent,-1,sizeof(parent));        for(i=1;i<=n;i++)        {            scanf("%lf%lf",&di[i].x,&di[i].y);        }        for(i=1;i<n;i++)            for(j=i+1;j<=n;j++)            {                p[flag].a=i;                p[flag].b=j;                p[flag].len=dis(di[i],di[j]);                flag++;            }        double sum=0;        qsort(p,flag,sizeof(struct pos),comp); //一般用sort        for(i=0;i<flag;i++)        {            if(root(p[i].a)!=root(p[i].b))            {                merge(p[i].a,p[i].b);                sum+=p[i].len;            }        }        printf("%.2lf\n",sum);    }}