# POJ 2560 Freckles 最小生成树 Kruskal+并查集使用

1886人阅读 评论(0)

http://poj.org/problem?id=2560

Freckles
 Time Limit: 1000MS Memory Limit: 65536K

Description

In an episode of the Dick Van Dyke show, little Richie connects the freckles on his Dad's back to form a picture of the Liberty Bell. Alas, one of the freckles turns out to be a scar, so his Ripley's engagement falls through.
Consider Dick's back to be a plane with freckles at various (x,y) locations. Your job is to tell Richie how to connect the dots so as to minimize the amount of ink used. Richie connects the dots by drawing straight lines between pairs, possibly lifting the pen between lines. When Richie is done there must be a sequence of connected lines from any freckle to any other freckle.

Input

The first line contains 0 < n <= 100, the number of freckles on Dick's back. For each freckle, a line follows; each following line contains two real numbers indicating the (x,y) coordinates of the freckle.

Output

Your program prints a single real number to two decimal places: the minimum total length of ink lines that can connect all the freckles.

Sample Input

3
1.0 1.0
2.0 2.0
2.0 4.0


Sample Output

3.41
/* Author : yan
* Question : POJ 2560 Freckles
* Date && Time : Monday, January 24 2011 07:43 PM
* Compiler : gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3
*/
#include<stdio.h>
#define MAX 101
typedef struct _node
{
float x,y;
};
struct _node point[MAX];

typedef struct _edge
{
int x,y;
float weight;
};
struct _edge edge[MAX*MAX];

int father[MAX];
int rank[MAX];

float ans;

void initial()
{
int _i;
memset(rank,0,sizeof(rank));
for(_i=0;_i<MAX;_i++)
father[_i]=_i;
}
int Find_Set(int x)
{
if(x!=father[x])
{
father[x]=Find_Set(father[x]);
}
return father[x];
}
int Union(int x,int y,float w)
{
x=Find_Set(x);
y=Find_Set(y);
if(x==y) return 0;
else if(rank[x]<=rank[y])
{
father[x]=y;
rank[y]+=rank[x];
}
else
{
father[y]=x;
rank[x]+=rank[y];
}
ans+=w;
return 1;
}
int cmp( const void *a ,const void *b )
{
return (*(struct _edge *)a).weight > (*(struct _edge *)b).weight ? 1 : -1;
}
float dis(struct _node a,struct _node b)
{
float tmp=(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
return sqrt(tmp);
}

void print(int cnt)
{
int i;
for(i=0;i<cnt;i++)
printf("%d %d %g/n",edge[i].x,edge[i].y,edge[i].weight);
}
int main()
{
//freopen("input","r",stdin);
int n;
int i,j;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%f %f",&point[i].x,&point[i].y);
}

int edge_cnt=0;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
edge[edge_cnt].x=i,edge[edge_cnt].y=j;
edge[edge_cnt].weight=dis(point[i],point[j]);
edge_cnt++;
}
}

//print(edge_cnt);
qsort(edge,edge_cnt,sizeof(edge[0]),cmp);
//print(edge_cnt);
initial();
for(i=0;i<edge_cnt;i++)
{
Union(edge[i].x,edge[i].y,edge[i].weight);
}
printf("%.2f",ans);

return 0;
}


0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：2375750次
• 积分：26945
• 等级：
• 排名：第212名
• 原创：383篇
• 转载：106篇
• 译文：3篇
• 评论：652条
博客专栏
 Linux内核网络栈源代码分析 文章：17篇 阅读：211089
 LaTeX使用 文章：5篇 阅读：66782
 Gentoo Linux使用技巧 文章：27篇 阅读：154136
 Linux内核学习笔记 文章：53篇 阅读：352190
 ARM-Linux驱动移植 文章：19篇 阅读：130506
 ARM-Linux驱动开发 文章：17篇 阅读：137653
评论排行
最新评论