您的位置:首页 > 其它

uva 10369 最小生成树

2017-09-24 16:52 459 查看
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int pre[1000];
double x[1000],y[1000];
double dis(double x1,double y1,double x2,double y2){
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
struct node{
int u,v;
double w;
}e[1000010];
bool cmp(const node &a,const node &b){
return a.w<b.w;
}
int find(int x){
return x==pre[x]?x:find(pre[x]);
}
int main(){
int T,cnt,s,p;
scanf("%d",&T);
while(T--){
cnt=0;
scanf("%d%d",&s,&p);
for(int i=0;i<p;i++)
scanf("%lf%lf",&x[i],&y[i]);
for(int i=0;i<p;i++){
for(int j=i+1;j<p;j++){
e[cnt].u=i;
e[cnt].v=j;
e[cnt++].w=dis(x[i],y[i],x[j],y[j]);
}
}
for(int i=0;i<=p;i++)
pre[i]=i;
sort(e,e+cnt,cmp);
int ans=0,res;
for(int i=0;i<cnt;i++){
int t1=find(e[i].u),t2=find(e[i].v);
if(t1!=t2){
pre[t1]=t2;
ans++;
res=i;
if(ans==p-s)
break;
}
}
printf("%.2f\n",e[res].w);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: