计蒜客习题:连线问题
2018-03-18 14:41
344 查看
问题描述
蒜头君和花椰菜君经常出难题考对方。一天,花椰菜君给蒜头君出了这样一道难题:花椰菜君在坐标系上随机画了 N 个点,然后让蒜头君给点之间连线,要求任意两点之间都是连通的,且所连的线段长度之和最小。聪明的你快来帮蒜头君解决一下吧。输入格式
第一行输入一个整数 N(1≤N≤100),表示花椰菜君一共画了 N 个点。然后输入 N 行,每行输入两个整数 x,y(0≤x,y≤1,000),代表一个点的坐标。
输出格式
输出一行,输出一个实数,表示所连线段长度之和的最小值(结果四舍五入保留两位小数)。
样例输入
4
1 1
2 2
3 3
3 1
样例输出
4.24
AC代码
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> using namespace std; int INF=0x3f3f3f3f; int dad[500]; int G[5000][2]; struct edge{ int u,v; double w; }e[200000]; bool cmp(edge a,edge b) { return a.w<b.w; } int getdad(int i) { if(dad[i]==i)return dad[i]; return dad[i]=getdad(dad[i]); } int main() { int n; for (int i = 1; i <= 105; i++) dad[i] = i; memset(G, INF, sizeof(G)); cin >> n; for(int i=1;i<=n;i++) { cin>>G[i][0]>>G[i][1]; } int eid = 1; for (int i = 1; i <= n; i++) { for (int j = i + 1; j <= n; j++) { e[eid].u = i; e[eid].v = j; e[eid].w = sqrt((G[i][0]-G[j][0])*(G[i][0]-G[j][0])+(G[i][1]-G[j][1])*(G[i][1]-G[j][1])); eid++; } } sort(e+1, e+eid, cmp); int rest = n; double ans = 0; for (int i b1ec = 1; i < eid - 1 && rest > 1; i++) { int x = e[i].u; int y = e[i].v; if (getdad(x) != getdad(y)) { dad[getdad(x)] = getdad(y); ans += e[i].w; rest--; } } //ans+=0.005; printf("%.2f", ans); return 0; }
相关文章推荐
- 计蒜客-习题 A+B问题(大整数)
- C++ primer 习题9.26 的问题。
- [裴礼文数学分析中的典型问题与方法习题参考解答]4.3.3
- 构造,析构,复制构造,重载=,和自动创建无名变量的问题(习题)
- 习题 5.12 猴子吃桃问题。
- [裴礼文数学分析中的典型问题与方法习题参考解答]4.3.13
- 计蒜客习题(java)-打印锯齿矩阵
- 计蒜客 [蒜头君的购物袋1] 01背包问题
- 习题4.5 顺序存储的二叉树的最近的公共祖先问题(25 分)
- 计蒜客 机器人的相遇问题(扩展欧几里得模板题)
- [裴礼文数学分析中的典型问题与方法习题参考解答]4.4.5
- [裴礼文数学分析中的典型问题与方法习题参考解答]4.4.8
- [裴礼文数学分析中的典型问题与方法习题参考解答]4.5.10
- 【笔试基础】页式存储管理问题一些习题
- 微分方程及边值问题:计算与建模 习题1.17-1.31
- [裴礼文数学分析中的典型问题与方法习题参考解答]5.1.14
- 计蒜客 A+B+C问题
- 习题 17:排队提水问题★★
- iOS_TUTK_多台设备同时连线卡UI问题
- C++Primer 第四版 习题9.27的答案问题