poj 2349 最小生成树 careful everything!

来源:互联网 发布:手机信号探测软件 编辑:程序博客网 时间:2024/06/04 21:13
#include <stdlib.h>#include <stdio.h>#include <iostream>#include <math.h>using namespace std;#define NUM 505typedef 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;}

原创粉丝点击