蓝桥杯 17. 通电

通电

原题目链接

题目描述

2015 年,全中国实现了户户通电。作为一名电力建设者,小明正在帮助一带一路上的国家通电。

这一次,小明要帮助 n 个村庄通电,其中 1 号村庄正好可以建立一个发电站,所发的电足够所有村庄使用。

现在,这 n 个村庄之间都没有电线相连,小明主要要做的是架设电线连接这些村庄,使得所有村庄都直接或间接地与发电站相通。

小明测量了所有村庄的位置(坐标)和高度。如果要连接两个村庄,小明需要花费:

in 复制代码
sqrt((x1 - x2)^2 + (y1 - y2)^2) + (h1 - h2)^2

其中 (x1, y1, h1) 和 (x2, y2, h2) 分别是两个村庄的坐标和高度。

请帮助小明计算使所有村庄通电所需的最小费用。


输入描述

  • 第一行一个整数 n,表示村庄的数量。
  • 接下来的 n 行,每行包含三个整数 x y h,分别表示一个村庄的横坐标、纵坐标和高度。

第一个村庄(第 1 行)可以建立发电站。

数据范围:

  • 1 ≤ n ≤ 1000
  • 0 ≤ x, y, h ≤ 10000

输出描述

输出一行一个实数,表示最小通电费用,四舍五入保留两位小数


输入示例

in 复制代码
4
1 1 3
9 9 7
8 8 6
4 5 4

输出示例

out 复制代码
17.41

c++代码

cpp 复制代码
#include<bits/stdc++.h>
#include<stdio.h>

using namespace std;

struct line {
    int a, b;
    double val;
};

struct mycom{
    bool operator()(const line& a, const line& b) { return a.val > b.val; }
};

vector<vector<int>> arr;
vector<int> vis;
line tem;
double ans = 0;
int n;

double delta(int a, int b) {
    return sqrt((arr[a][0] - arr[b][0]) * (arr[a][0] - arr[b][0]) + (arr[a][1] - arr[b][1]) * (arr[a][1] - arr[b][1])) + (arr[a][2] - arr[b][2]) * (arr[a][2] - arr[b][2]);
}

int main() {
    cin >> n;
    arr = vector<vector<int>>(n + 1, vector<int>(3)), vis = vector<int>(n + 1, 0);
    for (int i = 1; i <= n; i++) cin >> arr[i][0] >> arr[i][1] >> arr[i][2];
    int start = 1;
    priority_queue<line, vector<line>, mycom> q;
    for (int i = 0; i < n - 1; i++) {
        vis[start] = 1;
        for (int j = 1; j <= n; j++) {
            if (vis[j]) continue;
            tem.a = start, tem.b = j, tem.val = delta(start, j);
            q.push(tem);
        }
        while(vis[q.top().b]) q.pop();
        ans += q.top().val, start = q.top().b, q.pop();
    }
    printf("%.2lf", ans);
    return 0;
}//by wqs

题目解析

把所有边都连接起来,然后在这个完全图里面找最小生成树。

相关推荐
我能坚持多久6 分钟前
C++类与对象(中)
开发语言·c++
别或许7 分钟前
2、高数----数列极限(知识总结)
算法
山栀shanzhi9 分钟前
深入C++之:一个类有几张虚函数表?
c++·面试
hnjzsyjyj10 分钟前
洛谷 P8749:[蓝桥杯 2021 省 B] 杨辉三角形 ← 组合数 + 二分
蓝桥杯·二分·杨辉三角·组合数
江奖蒋犟10 分钟前
【C++】map和set
开发语言·数据结构·c++·set·map
森G12 分钟前
3.1、移植Qt程序到ARM平台----移植Qt程序到ARM平台(扩展)
arm开发·c++·qt
汀、人工智能13 分钟前
[特殊字符] 第78课:乘积最大子数组
数据结构·算法·数据库架构·数组·前缀积·乘积最大子数组
tankeven13 分钟前
HJ168 小红的字符串
c++·算法
数据知道16 分钟前
claw-code 源码分析:cargo 视角的 definitive runtime——会话、压缩、MCP、提示构造如何落到系统语言?
算法·ai·claude code·claw code
汀、人工智能19 分钟前
[特殊字符] 第41课:翻转二叉树
数据结构·算法·数据库架构·图论·bfs·翻转二叉树