UVa 10369 Arctic Network (Kruskal+最小生成树的第K小边)

来源:互联网 发布:mysql输入密码后闪退 编辑:程序博客网 时间:2024/06/05 06:16
#include<cstdio>#include<algorithm>#include<iostream>#include<cmath>#include<climits>#include<queue>#include<vector>#include<set>#include<map>#include<cstring>#include<string>using namespace std;const int INF=100000000;const int maxp=500+10;const int maxe=500*500+10;int N,S,P,E;struct edge{int u,v;double cost;edge(int u=0,int v=0,double cost=0.0):u(u),v(v),cost(cost){}};struct Point{double x,y;Point(double x=0.0,double y=0.0):x(x),y(y){}};edge es[maxe];Point point[maxp];int p[maxp];double route[maxe];int num;bool cmp(const edge& e1,const edge& e2){return e1.cost<e2.cost;}int find(int x){return p[x]==x ? x:p[x]=find(p[x]);}void Kruskal(){sort(es,es+E,cmp);num=0;for(int i=0;i<P;i++)p[i]=i;for(int i=0;i<E;i++){edge e=es[i];int x=find(e.u);int y=find(e.v);if(x!=y){route[num++]=e.cost;p[x]=y;}}}int main(){scanf("%d",&N);while(N--){scanf("%d%d",&S,&P);for(int i=0;i<P;i++){scanf("%lf%lf",&point[i].x,&point[i].y);}E=0;for(int i=0;i<P;i++)for(int j=i+1;j<P;j++){double d=sqrt((point[i].x-point[j].x)*(point[i].x-point[j].x)+(point[i].y-point[j].y)*(point[i].y-point[j].y));es[E++]=edge(i,j,d);}Kruskal();sort(route,route+num);printf("%.2lf\n",route[num-S]);}return 0;}

0 0
原创粉丝点击