杭电ACM1162(prim)
2015-11-22 16:33
323 查看
</pre>题目链接:<a target=_blank target="_blank" href="http://acm.hdu.edu.cn/showproblem.php?pid=1162">http://acm.hdu.edu.cn/showproblem.php?pid=1162</a><p></p><p>题目大意:在一个平面上有若干点,给出它们的横纵坐标,要求求出将这些点全部连通的距离。</p><p>解题思路:最小生成树,prim算法。不同的是输入点坐标之后要自行进行一次转化就变成了标准的最短路径问题。</p><p>AC代码:</p><p></p><pre name="code" class="cpp">#include <iostream> #include <stdio.h> #include <math.h> #include <string.h> using namespace std; #define INF 2000000 struct Node//定义点 { double x,y; }point[105]; double realdis[105][105]; int n; double ddistance(Node a,Node b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } double prim() { double result=0; double p[105]; bool used[105]; for(int i=1;i<=n;i++)p[i] = realdis[1][i]; memset(used,0,sizeof(used)); for(int i=1;i<=n;i++) { double min = INF; int index; for(int j=1;j<=n;j++) { if(!used[j]&&min>p[j]) { min = p[j]; index = j; } } result+=p[index]; used[index] = 1; for(int j=1;j<=n;j++) { if(!used[j]) p[j] = realdis[index][j]<p[j]?realdis[index][j]:p[j]; } } return result; } int main() { while(cin>>n) { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { realdis[i][j] = INF; if(i==j)realdis[i][j] = 0; } } for(int i=1;i<=n;i++) { cin>>point[i].x>>point[i].y; } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { realdis[i][j] = ddistance(point[i],point[j]); } } printf("%.2lf\n",prim()); } return 0; }
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析
- C#获取关键字附近文字算法实例