当前位置: 首页 > news >正文

题解:洛谷 P2052 [NOI2011] 道路修建

【题目来源】

洛谷:[P2052 NOI2011] 道路修建 - 洛谷

【题目描述】

在 W 星球上有 \(n\) 个国家。为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通。但是每个国家的国王都很吝啬,他们只愿意修建恰好 \(n - 1\) 条双向道路。

每条道路的修建都要付出一定的费用,这个费用等于道路长度乘以道路两端 的国家个数之差的绝对值。例如,在下图中,虚线所示道路两端分别有 \(2\) 个、\(4\) 个国家,如果该道路长度为 \(1\),则费用为 \(1×|2 - 4|=2\)。图中圆圈里的数字表示国家的编号。

image

由于国家的数量十分庞大,道路的建造方案有很多种,同时每种方案的修建费用难以用人工计算,国王们决定找人设计一个软件,对于给定的建造方案,计算出所需要的费用。请你帮助国王们设计一个这样的软件。

【输入】

输入的第一行包含一个整数 \(n\),表示 W 星球上的国家的数量,国家从 \(1\)\(n\) 编号。

接下来 \(n - 1\) 行描述道路建设情况,其中第 \(i\) 行包含三个整数 \(a_i\)\(b_i\)\(c_i\),表示第 \(i\) 条双向道路修建在 \(a_i\)\(b_i\) 两个国家之间,长度为 \(c_i\)

【输出】

输出一个整数,表示修建所有道路所需要的总费用。

【输入样例】

6
1 2 1
1 3 1
1 4 2
6 3 1
5 2 1

【输出样例】

20

【算法标签】

《洛谷 P2052 道路修建》 #树形数据结构# #广度优先搜索BFS# #深度优先搜索DFS# #NOI# #2011#

【代码详解】

#include <bits/stdc++.h>
using namespace std;
#define int long long  // 将int定义为long long类型
const int N = 1000005, M = N * 2;  // N: 最大节点数, M: 最大边数(双向边)int n;           // 节点数
int cnt[N];      // cnt[u]: 以u为根的子树大小
int ans;         // 最终答案
int h[N];        // 邻接表头
int e[M];        // 边的终点
int w[M];        // 边的权重
int ne[M];       // 下一条边
int idx;         // 边计数器// 添加边
void add(int a, int b, int c)
{e[idx] = b;      // 存储终点w[idx] = c;      // 存储边权ne[idx] = h[a];  // 插入到链表头部h[a] = idx++;    // 更新头指针
}// 第一次DFS:计算每个节点的子树大小
void dfs(int u, int fa)
{cnt[u] = 1;  // 初始化,包含自己// 遍历所有邻接点for (int i = h[u]; i != -1; i = ne[i]){int j = e[i];  // 子节点if (j == fa) continue;  // 跳过父节点dfs(j, u);  // 递归处理子节点cnt[u] += cnt[j];  // 累加子树的节点数}
}// 第二次DFS:计算总贡献
void dfs2(int u, int fa)
{// 遍历所有邻接点for (int i = h[u]; i != -1; i = ne[i]){int j = e[i];  // 子节点if (j == fa) continue;  // 跳过父节点// 计算边(u, j)的贡献// cnt[j]: 子树j的节点数// n - cnt[j]: 另一部分的节点数// 两部分的差值乘以边权ans += w[i] * abs(cnt[j] - (n - cnt[j]));// 递归处理子节点dfs2(j, u);}
}signed main()  // 因为使用了#define int long long,所以用signed main
{// 初始化邻接表memset(h, -1, sizeof(h));// 输入节点数cin >> n;// 输入n-1条边for (int i = 1; i < n; i++){int u, v, w;// 使用scanf加速输入scanf("%d%d%d", &u, &v, &w);// 添加双向边add(u, v, w);add(v, u, w);}// 第一次DFS:计算子树大小dfs(1, 0);// 第二次DFS:计算总贡献dfs2(1, 0);// 输出结果cout << ans << endl;return 0;
}

【运行结果】

6
1 2 1
1 3 1
1 4 2
6 3 1
5 2 1
20
http://www.jsqmd.com/news/394613/

相关文章:

  • 题解:洛谷 P1351 [NOIP 2014 提高组] 联合权值
  • 题解:洛谷 P5836 [USACO19DEC] Milk Visits S
  • YOLO26涨点改进 | 全网独家创新、注意力改进篇 | SCI一区 2025 | YOLO26引入MSCA多尺度稀疏交叉聚合,GCBAM分组注意力,助力遥感目标检测、图像分类任务有效涨点
  • 题解:洛谷 P3128 [USACO15DEC] Max Flow P
  • 题解:洛谷 P3379 【模板】最近公共祖先(LCA)
  • 题解:洛谷 P1395 会议
  • Claude Sonnet 4.6发布,操控计算机能力大幅提升,100万token上下文
  • 京东 e 卡闲置别浪费!可可收更安心,这样选最省心 - 可可收
  • 题解:洛谷 P3372 【模板】线段树 1
  • 研磨废水回用厂家怎么挑?2026年攻略来了,实验室废水处理/研磨废水回用(处理)/零排放清洗,研磨废水回用源头厂家找哪家 - 品牌推荐师
  • 题解:洛谷 P1099 [NOIP 2007 提高组] 树网的核
  • 闲置支付宝立减金别浪费!合规回收方法来了,新手也能轻松上手 - 可可收
  • Python3教程梳理
  • 题解:洛谷 P5908 猫猫和企鹅
  • 题解:洛谷 P5677 [GZOI2017] 配对统计
  • 2026沸石转轮一体机企业TOP榜:哪些品牌值得关注?催化燃烧/旋风除尘器/除尘器,沸石转轮制造厂家排行榜单 - 品牌推荐师
  • 瑞祥商联卡闲置不用?这样的合规回收方式,新手也能轻松上手 - 可可收
  • 2026年值得推荐的AVIF转WebP在线工具盘点(支持批量转换)
  • 微信立减金回收技巧:47%闲置率下,5招盘活你的“隐形财富” - 可可收
  • 2026年溴化锂中央空调选购指南:值得关注的公司,溴化锂冷水机组/二手溴化锂中央空调,溴化锂中央空调制造企业有哪些 - 品牌推荐师
  • PAM4相关概念
  • 2026年行业内评价高的调节阀厂商如何选,电液动盲板阀/蝶式止回阀/微阻缓闭止回阀/伸缩蝶阀,调节阀生产厂家哪家权威 - 品牌推荐师
  • 2026年中考体育训练新趋势:智慧体育制造企业深度解析,智能运动手环管理平台/握力测试仪,智慧体育生产厂家哪家好 - 品牌推荐师
  • 闲置分期乐购物额度用不上?教你安全高效回收,不浪费一分额度 - 可可收
  • 题解:洛谷 P1631 序列合并
  • 题解:洛谷 P4053 [JSOI2007] 建筑抢修
  • 题解:洛谷 P2161 [SHOI2009] 会场预约
  • 书籍-阿尔伯特·赫尔曼《亚洲古代地理学》
  • IndicEval A Bilingual Indian Educational Evaluation Framework for Large Language Models
  • 2026年上海有实力的宠物口腔医生口碑推荐榜,猫咪牙科/牙科专科/狗狗洗牙/狗口腔溃疡诊疗,宠物口腔医生性价比高的推荐 - 品牌推荐师