并查集专题-1001 Freckles
2015-08-28 20:57
295 查看
(I) 原文就不给出了,题目原文意思是:在一个二维平面内有多个点,求 出能把他们全部连接在一起的最短长度;
也就是让你求若干二维点构成的最小生成树;
Prim 算法:
扩展: 上面的题目讲的是二维点,我们将二维扩展到三维空间内谈论;
也就是让你求若干二维点构成的最小生成树;
Prim 算法:
#include<stdio.h> #include<math.h> #include<string.h> #define Max 999999999.0 int v[101]; double d[101],dd[101][101]; int n; struct Point { double x,y; }m[101]; double dis(Point a,Point b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } int main() { int i,j,k; double ans; while(~scanf("%d",&n)) { for(i=1;i<=n;i++) { scanf("%lf %lf",&m[i].x,&m[i].y); } memset(v,0,sizeof(v)); for(i=1;i<=n;i++) { for(j=i+1;j<=n;j++) { dd[i][j]=dd[j][i]=dis(m[i],m[j]); } dd[i][i]=0.0; } ans=0.0; for(int i=1;i<=n;i++) { d[i]=dd[1][i]; } while(1) { j=-1; double min=Max; for(i=1;i<=n;i++) { if(!v[i]&&d[i]<min) { j=i; min=d[i]; } } if(j==-1) { printf("%.2lf\n",ans); break; } v[j]=1; ans+=min; for(i=1;i<=n;i++) { if(!v[i]&&d[i]>dd[j][i]) { d[i]=dd[j][i]; } } } } }Krusal算法:
#include<stdio.h> #include<math.h> #include<algorithm> using namespace std; struct Point { double x,y; }m[102]; struct edge { int a,b; double len; }e[5600]; int n,num,pre[102]; double ans; double dis(Point a,Point b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } bool cmp(edge a,edge b) { return a.len<b.len; } int find(int x) { if(x!=pre[x]) pre[x]=find(pre[x]); return pre[x]; } void Union(int a,int b) { a=find(a); b=find(b); pre[a]=b; } void init() { int i,j; for(i=1;i<=n;i++) pre[i]=i; for(i=1;i<=n;i++) { for(j=i+1;j<=n;j++) { e[num].a=i; e[num].b=j; e[num].len=dis(m[i],m[j]); num++; } } } int main() { int i,j,a,b; while(~scanf("%d",&n)) { for(i=1;i<=n;i++) scanf("%lf %lf",&m[i].x,&m[i].y); num=0; ans=0.0; init(); sort(e,e+num,cmp); int flag=0; for(i=0;i<num&&flag<n-1;i++) { a=find(e[i].a); b=find(e[i].b); if(a!=b) { Union(a,b); ans+=e[i].len; flag++; } } printf("%.2lf\n",ans); } }
扩展: 上面的题目讲的是二维点,我们将二维扩展到三维空间内谈论;
相关文章推荐
- python 深度模仿 matlab 矩阵语法
- Mac上安装 Maven
- 剑指offer-第五章优化时间和空间效率(从1到n的整数中1出现的次数)
- 待熟悉的工具或API清单列表
- [转]Spring Security学习总结二
- Foundation框架中字符串的查找(rangOfString)
- android中<include><merge><ViewStub>
- 设置导航栏按钮主题
- dede使用方法----调用导航
- [转]Spring Security学习总结一
- 黑马程序员——IO流——递归,字节流,字符流
- UI基础----基本控件的使用之ImageView
- HDU-1272 小希的迷宫
- 索引建立的原则
- Android中使用overridePendingTransition实现Activity切换动画
- linux 远程gui管理 webmin
- mysql query cache
- 并查集简要分析
- 创建索引时的注意事项
- LVM的基本认识及使用