HDU 1875-kruskal
2015-06-09 20:33
225 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1875
思路:还是简单的最小生成树;
代码:
#include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #include <iostream> #include<cmath> using namespace std; const int maxn=10009; struct Node { int x,y; double w; bool operator<(const Node &a)const { return w<a.w; } } sd[maxn]; struct node { int a,b; } sk[maxn]; int p[maxn],n,m; int Find(int x) { if(p[x]==-1) { return x; } return p[x]=Find(p[x]); } void Kruskal(int k) { double ans=0; int cnt=0; for(int i=0; i<k; i++) { int x=Find(sd[i].x); int y=Find(sd[i].y); if(x!=y) { cnt++; ans+=sd[i].w; p[x]=y; } } if(cnt<n-1) printf("oh!\n"); else printf("%.1lf\n",ans); } double gh(double a,double b,double c,double d) { return sqrt((a-c)*(a-c)+(b-d)*(b-d)); } int main() { while(scanf("%d",&m)!=EOF) { for(int i=0; i<m; i++) { scanf("%d",&n); memset(p,-1,sizeof(p)); for(int i=0; i<n; i++) scanf("%d%d",&sk[i].a,&sk[i].b); int k=0; for(int i=0; i<n-1; i++) { for(int j=i+1; j<n; j++) { double df=gh(sk[i].a,sk[i].b,sk[j].a,sk[j].b); // printf("&&&%d\n",df); if(df>=10&&df<=1000) { sd[k].w=df*100.0; sd[k].x=i; sd[k].y=j; k++; } } } sort(sd,sd+k); Kruskal(k); } } return 0; }
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#数据结构与算法揭秘二
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析
- C#常见算法面试题小结
- JavaScript 组件之旅(二)编码实现和算法
- JavaScript数据结构和算法之图和图算法