http://poj.org/problem?id=2560
Time Limit: 1000MS | Memory Limit: 65536K |
Description
Input
Output
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; }