杭电ACM1162——Eddy's picture~~最小生成树
来源:互联网 发布:部落冲突箭塔升级数据 编辑:程序博客网 时间:2024/05/20 05:30
这一题,就是简单的最小生成树的应用。开始,没有想到用最小生成树做,想到的是贪心,当知道了用最小生成树做的时候,还犯了一个很严重的错误,就是时间复杂度的估计错了,导致开始不敢写,在想其他的办法。当作一次教训吧。
下面是AC的代码,有详细的注释,用的是并查集来判环,时间复杂度为nlogn,主要时间在排序上。
#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>using namespace std;class data //每两个点直接的边的数据{public:int from, to; //起点与终点double dis; //距离};data Dis[15000]; //最多边的时候,大概接近10000double xy[105][2];int par[105], n, m; //par为并查集int cmp(const data& a, const data& b) //排序按距离从小到大排{return a.dis < b.dis;}int finds(int x) //并查集查找函数{if(x == par[x])return x;elsereturn par[x] = finds(par[x]);}void join(int x, int y) //并查集合并函数{x = finds(x);y = finds(y);if(x != y)par[y] = x;}double kru() //kruskal算法{for(int i = 0; i <= n; i++) //初始化并查集{par[i] = i;}sort(Dis, Dis + m, cmp); //排序double ans = 0.0;for(int j = 0; j < m; j++){if(finds(Dis[j].from) != finds(Dis[j].to)) //判是否存在环{ans += Dis[j].dis;join(Dis[j].from, Dis[j].to); //合并两点}}return ans;}int main(){while(scanf("%d", &n) != EOF){m = 0;for(int i = 0; i < n; i++){scanf("%lf%lf", &xy[i][0], &xy[i][1]);}for(int j = 0; j < n; j++) //求每两点之间的距离{for(int k = j + 1; k < n; k++){Dis[m].from = j;Dis[m].to = k;Dis[m++].dis = sqrt(pow((xy[j][0] - xy[k][0]), 2) + pow((xy[j][1] - xy[k][1]), 2));}}double ans = kru();printf("%.2lf\n", ans); //这里用C++提交的,如果用G++,应该改成 %.2f}return 0;}
1 0
- 杭电ACM1162——Eddy's picture~~最小生成树
- 杭电1162 Eddy's picture 最小生成树
- 杭电1162Eddy's picture(最小生成树)
- 杭电ACM1162(最小生成树)
- 【杭电oj】1162 - Eddy's picture(最小生成树)
- Eddy's picture(最小生成树)
- HDU1162 Eddy's picture 最小生成树
- 最小生成树——— 克鲁斯卡尔 hdu 1162 Eddy's picture
- (step 6.1.9)hdu 1162(Eddy's picture——最小生成树)
- hdu 1162 Eddy's picture(最小生成树Prim算法)
- hdu 1162 Eddy's picture(最小生成树Kruskal)
- HDOJ 1162:Eddy's picture 求解最小生成树
- HDUOJ 1162 Eddy's picture(最小生成树)
- HDOJ 1162 Eddy's picture(最小生成树 - kruskal)
- HDU 1162 Eddy's picture 最小生成树
- hdu 1162 Eddy's picture(最小生成树)
- hdu1162 Eddy's picture (prim最小生成树)
- hdu1162 Eddy's picture (最小生成树之prim 算法)
- 《C语言及程序设计》程序阅读——洗牌
- oracle 数据库的概念
- rails自定义校验
- 琼海建“东部中心城市”,三亚失“最美国事活动”
- Mysql修改root账号密码
- 杭电ACM1162——Eddy's picture~~最小生成树
- hdu1282 回文数猜想 字符串操作
- 第六章 堆排序 C++
- 套接字编程原理
- JDK8新特性之接口
- Rails开发实录:建立用户与信息之间的关系
- 人脑开发利用了多少潜能到底有多大- 10%只是“传说”
- c++ 形参问题
- 生产者与消费者问题