标签:spec def ISE span 卡尔 lines printf int clu
题目链接:http://poj.org/problem?id=2349
Description
Input
Output
Sample Input
1 2 4 0 100 0 300 0 600 150 750
Sample Output
212.13
1 /* 2 问题 3 题目理解起来有一定的难度,理解了就是水题一道。怎么理解呢?就是一遍一遍的读。 4 重要的是每个顶点会配备一个无线接收器,其中一些顶点还会配备一个卫星信道。现在给出卫星信道的个数和顶点个 5 数以及每个顶点的坐标,计算并输出构成最小生成树的第s大的那条边是多少 6 7 解题思路 8 刚开始读题的时候以为要消去s条边,结果计算样例的结果是200,其实是卫星信道的个数,换句换说每两个卫星信道 9 才可以消去一条边。 10 处理每两点之间的边,使用克鲁斯卡尔算法一条一条的加入,直至构成最小生成树,然后数s条边即可。 11 */ 12 #include<cstdio> 13 #include<math.h> 14 #include<algorithm> 15 16 using namespace std; 17 struct NODE{ 18 int x,y; 19 }node[1010]; 20 21 struct EDGE{ 22 int u,v; 23 double w; 24 }edge[300010]; 25 int cmp(struct EDGE a,struct EDGE b){ 26 return a.w<b.w; 27 } 28 int f[1010]; 29 int merge(int v,int u); 30 int getf(int v); 31 int main() 32 { 33 int t,s,p,i,j,k; 34 scanf("%d",&t); 35 while(t--) 36 { 37 scanf("%d%d",&s,&p); 38 for(i=1;i<=p;i++){ 39 scanf("%d%d",&node[i].x,&node[i].y); 40 } 41 42 k=0; 43 for(i=1;i<=p-1;i++){ 44 for(j=i+1;j<=p;j++){ 45 edge[k].u=i; 46 edge[k].v=j; 47 edge[k].w=sqrt(1.0*(node[i].x-node[j].x)*(node[i].x-node[j].x) + 48 1.0*(node[i].y-node[j].y)*(node[i].y-node[j].y)); 49 //printf("%lf\n",edge[k].w); 50 } 51 } 52 sort(edge,edge+k,cmp); 53 54 /*for(i=0;i<k;i++) 55 printf("%lf\n",edge[i].w);*/ 56 57 for(i=1;i<=p;i++) 58 f[i]=i; 59 60 int cou=0; 61 for(i=0;i<k;i++){ 62 if(merge(edge[i].u,edge[i].v)){ 63 //printf("选择了第%d这条边%.2lf\n",i,edge[i].w); 64 cou++; 65 } 66 if(cou == p-s){ 67 printf("%.2lf\n",edge[i].w); 68 break; 69 } 70 } 71 } 72 return 0; 73 } 74 75 int getf(int v) 76 { 77 return f[v]==v?v:f[v]=getf(f[v]); 78 } 79 80 int merge(int v,int u) 81 { 82 int t1,t2; 83 t1=getf(v); 84 t2=getf(u); 85 if(t1 != t2){ 86 f[t2]=t1; 87 return 1; 88 } 89 return 0; 90 }
POJ 2349 Arctic Network(最小生成树中第s大的边)
标签:spec def ISE span 卡尔 lines printf int clu
原文地址:https://www.cnblogs.com/wenzhixin/p/8996836.html