首页 > 代码库 > hdu 2349 最小生成树
hdu 2349 最小生成树
/* 刚开始想错了,我以为必须是相邻的点才能连接,原来无线距离可以任意连接
对最小生成树理解不够深啊 */ #include<stdio.h> #include<math.h> #include<stdlib.h> #include<string.h> #define N 600 struct node { int u,v; }f[N]; struct nodee{ int u,v; double w; }ff[N*N]; double distance(int i,int j) { return sqrt((f[i].u-f[j].u)*(f[i].u-f[j].u)*1.0+1.0*(f[i].v-f[j].v)*(f[i].v-f[j].v)); } int cmp(const void *a,const void *b) { return (*(struct nodee *)a).w>(*(struct nodee *)b).w?1:-1; } int pre[N]; int find(int x) { if(x!=pre[x]) pre[x]=find(pre[x]); return pre[x]; } int main() { int t,n,m,i,j,k,len,e; scanf("%d",&t); while(t--) { scanf("%d%d",&m,&n); for(i=0;i<n;i++) scanf("%d%d",&f[i].u,&f[i].v); len=0; for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) { ff[len].u=i+1; ff[len].v=j+1; ff[len++].w=distance(i,j); } for(i=1;i<=n;i++) pre[i]=i; qsort(ff,len,sizeof(ff[0]),cmp); k=0; for(i=0;i<len;i++){ int a=find(ff[i].u); int b=find(ff[i].v); if(a!=b) { pre[a]=b; k++; if(k==n-m)break; } } printf("%.2f\n",ff[i].w); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。