题目大意

  给出一棵树上每两个叶子节点之间的距离,求树的总边权和。

题解

  定义节点a到b的简单路径长度为[a,b],树中节点c要到达路径[a,b]所要经过的距离为dist(c, [a,b]),在树中,与节点c相连的边的边权为e(c)。

  显然画个图或列个方程就可以知道dist(c, [a,b]) = ([a,c] + [b,c] - [a,b])/2,假设我们已经把1至i个节点加入到树中,此时再加入一个节点d,树所增加的重量便是e(d)。怎么求呢?我们假设正确的做法就是把d用一条边与树相连,设交点为u。对于树上原有的i个点,任意选出两个点x,y,如果u在[x,y]上,则dist(d, [x,y]) = e(d)。如果u不在[x,y]上,则dist(d, [x,y]) = e(d) + dist(u, [x,y])。因此e(d)=min{d, [x,y]}。所以一个一个叶子节点往树里插即可。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int MAX_N = 50, INF = 0x3f3f3f3f;
int Dist[MAX_N][MAX_N]; int main()
{
int n;
while (scanf("%d", &n) && n)
{
for (int i = 1; i <= n; i++)
for (int j = i + 1; j <= n; j++)
scanf("%d", &Dist[i][j]);
int ans = Dist[1][2];
for (int i = 3; i <= n; i++)
{
int eLen = INF;
for (int j = 1; j <= i - 1; j++)
for (int k = j + 1; k <= i - 1; k++)
eLen = min(eLen, (Dist[j][i] + Dist[k][i] - Dist[j][k]) / 2);
ans += eLen;
}
printf("%d\n", ans);
}
}

  

最新文章

  1. jvm--2.类加载机制
  2. 纯css3手机页面图标样式代码
  3. 几种获取IP 根据IP获取地址的方法 JS,第三方 新浪 网易 腾讯
  4. 中文 iOS/Mac 开发博客列表(转)
  5. 懂DOS终于发挥了一点作用:phoenix bios密码破解
  6. 《zw版&#183;delphi与halcon系列原创教程》hello,zw
  7. (一)Bootstrap简介
  8. Esper系列(十一)NamedWindow语法Merge、Queries、Indexing、Dropping
  9. ChartControl第一课简短的控件初步设计
  10. JavaScript之面向对象学习四原型对象的动态性
  11. angularjs+ionic注册页面表单验证(手机号、确认密码、60s后重发验证码)
  12. 201521123087 《Java程序设计》第2周学习总结
  13. java.lang.IllegalStateException: Cannot forward after response has been committed的一个情况解决方法
  14. 英语口语练习系列-C32-建筑-述说时间-暮秋独游曲江
  15. MVC笔记之一:MVC编程模型
  16. js事件绑定的几种方式
  17. 20165315 实验一 Java开发环境的熟悉
  18. 设计模式之代理模式(Proxy Pattern)_远程代理解析
  19. 2、图文讲解.NET CLR是什么
  20. 子墨庖丁Android的ActionBar源代码分析 (一)实例化

热门文章

  1. Quartz中时间参数说明 即Cron表达式
  2. MonoBehaviour简述
  3. 基于openstack平台的几种Cloud DB解决方案
  4. 一个有趣的 ”Validation of viewstate MAC failed” 错误的发现和解决
  5. 06--Qt窗口布局
  6. ARX自定义实体
  7. 视频cover占满
  8. 程序员不可不知的Linux性能工具
  9. 运维是做什么的?史上最全互联网Linux工作规划!十分钟找到linux运维工程师职业方向!
  10. tp定时任务,传参问题