poj 2560_Freckles_并查集

来源:互联网 发布:大乐透软件0416ren 编辑:程序博客网 时间:2024/06/06 09:12

题目大意

就是一个最小生成树

思路

就是一个并查集优化的KURUSKAL

#include <stdio.h>#include <math.h>#include <algorithm>using namespace std;struct arr{    int x,y;    float z;};float a[101][101];float b[101][3];arr d[10000];int f[101];int cam(arr x,arr y){    return x.z<y.z;}int find(int x){    if(!f[x]) return x;    f[x]=find(f[x]);    return f[x];}int insert(int x,int y){    if (find(x)!=find(y))    {        f[find(x)]=find(y);        return 1;    }    return 0;}int main(){    int n;    scanf("%d",&n);    for (int i=1;i<=n;i++)        scanf("%f%f",&b[i][1],&b[i][2]);    for (int i=1;i<=n;i++)    {        for (int j=1;j<=n;j++)            a[i][j]=sqrt(((b[i][1]-b[j][1])*(b[i][1]-b[j][1]))+((b[i][2]-b[j][2])*(b[i][2]-b[j][2])));    }    int k=0;    float ans=0.0;    for (int i=1;i<=n;i++)        for (int j=1;j<=n;j++)            if (i!=j)             {                k++;                d[k].x=i;                d[k].y=j;                d[k].z=a[i][j];            }    sort(d+1,d+k+1,cam);    for (int i=1;i<=k;i++)    {        if (find(d[i].x)!=find(d[i].y))        {            ans+=d[i].z;            insert(d[i].x,d[i].y);        }    }    printf("%0.2f\n",ans);}
1 0
原创粉丝点击