#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;
#define NUM 505
typedef struct{
int x,y;
}Node;
Node nodes[NUM];
typedef struct{
int from;
int to;
double cost;
}Edge;
int cmp(const void* a,const void * b){
Edge aa=*((Edge *)a);
Edge bb=*((Edge *)b);
if(aa.cost>bb.cost)
return 1;
if(aa.cost==bb.cost)
return 0;
else
return -1;
}
Edge edges[NUM*NUM/2];
double GetLength(double x1,double y1,double x2,double y2){
double r=sqrt(double(abs(x1-x2)*abs(x1-x2)+abs(y1-y2)*abs(y1-y2)));
return r;
}
int root[NUM];
void init(){
for(int k=0;k<NUM;k++){
root[k]=k;
}
}
//不要失去警惕
//这里第三行代码错误的写成了
/*
root[a]=findroot(a);
所以在poj提交之后,得到了runtime error的错误
*/
int findroot(int a){
if(a!=root[a]){
root[a]=findroot(root[a]);
}
return root[a];
}
void unionroot(int root1,int root2){
root[root1]=root2;
}
int main(){
int T;
scanf("%d",&T);
for(int index=0;index<T;index++){
int S,P;
scanf("%d",&S);
scanf("%d",&P);
int k=0;
int i=0;
for(i=0;i<P;i++){
int x,y;
scanf("%d",&x);
scanf("%d",&y);
nodes[i].x=x;
nodes[i].y=y;
}
int j=0;
k=0;
for(i=0;i<P;i++){
for(j=0;j<i;j++){
edges[k].from=i;
edges[k].to=j;
edges[k].cost=GetLength(nodes[i].x,nodes[i].y,nodes[j].x,nodes[j].y);
k++;
}
}
//init();
qsort(edges,k,sizeof(Edge),cmp);
int num=0;
int kk=0;
init();
for(kk=0;kk<k;kk++){
int a=edges[kk].from;
int b=edges[kk].to;
int root1=findroot(a);
int root2=findroot(b);
if(root1!=root2){
unionroot(root1,root2);
num++;
if(num==P-S){
printf("%.2f\n",edges[kk].cost);
break;
}
}
}
}
return 0;
}
poj 2349 最小生成树 careful everything!
最新推荐文章于 2024-04-04 17:19:45 发布
本文详细阐述了一种使用并查集和贪心算法实现最小生成树的算法,通过实例演示了如何在给定节点集合和边权重的情况下找到最小生成树,并通过实例验证了算法的有效性和正确性。

1911

被折叠的 条评论
为什么被折叠?



