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

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;
}


• 本文已收录于以下专栏：

## POJ2560 Freckles(prim最小生成树)

Freckles Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7839   Accepted: 3763 ...

## POJ 2560 Freckles 最小生成树

• wmn_wmn
• 2012年04月12日 20:11
• 1480

## 文章标题 POJ 2349：Arctic Network （ 最小生成树Kruskal算法+并查集）

Arctic NetworkDescriptionThe Department of National Defence (DND) wishes to connect several northern...

## POJ1287 Networking (Kruskal与并查集求解最小生成树)

﻿﻿ Description You are assigned to design network connections between certain points in a wide are...

## 文章标题 POJ 2485 ： Highways（最小生成树--kruskal+并查集）

HighwaysDescription The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has no...

## POJ2560_Freckles_最小生成树

- -刚开始我看输入把我下了一跳，平面上n个点怎么遍历啊。后来才发现自己二到忘记看规模了，n...... 然后就是裸的最小生成树的Kruskal算法 悲催的是自己连这个都没有一遍过对自己的水平无语了 ...

## uva_10034 Freckles Kruskal (使用并查集) 或Prim

Kruskal   #include #include #include #define N 100 #define inf 1e200 using namespace std; dou...
• whu_zxl
• 2012年07月18日 19:28
• 245

举报原因： 您举报文章：POJ 2560 Freckles 最小生成树 Kruskal+并查集使用 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)