题目描述

树可以用来表示物种之间的进化关系。一棵“进化树”是一个带边权的树,其叶节点表示一个物种,两个叶节点之间的距离表示两个物种的差异。现在,一个重要的问题是,根据物种之间的距离,重构相应的“进化树”。

令N={1..n},用一个N上的矩阵M来定义树T。其中,矩阵M满足:对于任意的i,j,k,有M[i,j] + M[j,k] >= M[i,k]。树T满足:

1.叶节点属于集合N;

2.边权均为非负整数;

3.dT(i,j)=M[i,j],其中dT(i,j)表示树上i到j的最短路径长度。

如下图,矩阵M描述了一棵树。

树的重量是指树上所有边权之和。对于任意给出的合法矩阵M,它所能表示树的重量是惟一确定的,不可能找到两棵不同重量的树,它们都符合矩阵M。你的任务就是,根据给出的矩阵M,计算M所表示树的重量。下图是上面给出的矩阵M所能表示的一棵树,这棵树的总重量为15。

输入格式

输入数据包含若干组数据。每组数据的第一行是一个整数n(2<n<30)。其后n-1行,给出的是矩阵M的一个上三角(不包含对角线),矩阵中所有元素是不超过100的非负整数。输入数据保证合法。

输入数据以n=0结尾。

输出格式

对于每组输入,输出一行,一个整数,表示树的重量。

输入输出样例

输入 #1
  1. 5
  2. 5 9 12 8
  3. 8 11 7
  4. 5 1
  5. 4
  6. 4
  7. 15 36 60
  8. 31 55
  9. 36
  10. 0
输出 #1
  1. 15
  2. 71
  3.  
  4. Three Paths on a tree类似地构造一个树上最短路的式子
    把整张图看作一张AOE
  1. 通过这张网来建立一棵树,具体实现操作是:
    1、把一个为入树的点入树
    2、在已经入树的它的邻接点中遍历来更新把这个点入树的最小花费。

显然此时花费是 (dis[i][k] + dis[j][k] - dis[i][j]) / 2;

  1. 3、树的总重量加上把这个点入树的最小花费
  1. CODE
  1. #include <bits/stdc++.h>
  2. #define dbg(x) cout << #x << "=" << x << endl
  3. #define eps 1e-8
  4. #define pi acos(-1.0)
  5.  
  6. using namespace std;
  7. typedef long long LL;
  8.  
  9. template<class T>inline void read(T &res)
  10. {
  11. char c;T flag=;
  12. while((c=getchar())<''||c>'')if(c=='-')flag=-;res=c-'';
  13. while((c=getchar())>=''&&c<='')res=res*+c-'';res*=flag;
  14. }
  15.  
  16. namespace _buff {
  17. const size_t BUFF = << ;
  18. char ibuf[BUFF], *ib = ibuf, *ie = ibuf;
  19. char getc() {
  20. if (ib == ie) {
  21. ib = ibuf;
  22. ie = ibuf + fread(ibuf, , BUFF, stdin);
  23. }
  24. return ib == ie ? - : *ib++;
  25. }
  26. }
  27.  
  28. int qread() {
  29. using namespace _buff;
  30. int ret = ;
  31. bool pos = true;
  32. char c = getc();
  33. for (; (c < '' || c > '') && c != '-'; c = getc()) {
  34. assert(~c);
  35. }
  36. if (c == '-') {
  37. pos = false;
  38. c = getc();
  39. }
  40. for (; c >= '' && c <= ''; c = getc()) {
  41. ret = (ret << ) + (ret << ) + (c ^ );
  42. }
  43. return pos ? ret : -ret;
  44. }
  45.  
  46. const int maxn = ;
  47.  
  48. int dis[maxn][maxn];
  49. int n;
  50.  
  51. int main()
  52. {
  53. while(scanf("%d",&n) && n) {
  54. memset(dis, , sizeof(dis));
  55. for ( int i = ; i <= n; ++i ) {
  56. for ( int j = i+; j <= n; ++j ) {
  57. read(dis[i][j]);
  58. dis[j][i] = dis[i][j];
  59. }
  60. }
  61. int weight = ;
  62. int v = ;
  63. for ( int i = ; i <= n; ++i ) {
  64. int cost = 0x3f3f3f3f;
  65. for ( int j = ; j < i; ++j ) {
  66. int temp = dis[i][v] + dis[i][j] - dis[v][j];
  67. cost = min(cost, temp / );
  68. //dbg(cost);
  69. }
  70. if(cost != 0x3f3f3f3f)
  71. weight += cost;
  72. }
  73. cout << weight << endl;
  74. }
  75. return ;
  76. }
  1.  
  1.  

P1268 树的重量【构造】的更多相关文章

  1. luogu p1268 树的重量——构造,真正考验编程能力

    题目链接:http://www.luogu.org/problem/show?pid=1268#sub -------- 这道题费了我不少心思= =其实思路和标称毫无差别,但是由于不习惯ACM风格的题 ...

  2. 洛谷—— P1268 树的重量

    P1268 树的重量 构造类题目,看不出个所以然来... emmm,只好看题解: 只有两个点,那一条路径就是$ans$ 考虑三个点,那么$3$这个点相对于树上的路径(已经加入树上的边的距离) 为:$( ...

  3. [Luogu P1268] 树的重量 (巧妙的构造题)

    题面 传送门:https://www.luogu.org/problemnew/show/P1268 Solution 这是一道极其巧妙的构造题 先做一个约定[i,j]表示从i到j的距离 我们可以先从 ...

  4. 洛谷P1268 树的重量

    P1268 树的重量 85通过 141提交 题目提供者该用户不存在 标签树形结构 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 有这种情况吗!!!! 题意似乎有问题 题目描述 树可以用来表 ...

  5. 洛谷 P1268 树的重量 解题报告

    P1268 树的重量 题目描述 树可以用来表示物种之间的进化关系.一棵"进化树"是一个带边权的树,其叶节点表示一个物种,两个叶节点之间的距离表示两个物种的差异.现在,一个重要的问题 ...

  6. 洛谷P1268 树的重量 【构造 + 枚举】

    题目描述 树可以用来表示物种之间的进化关系.一棵"进化树"是一个带边权的树,其叶节点表示一个物种,两个叶节点之间的距离表示两个物种的差异.现在,一个重要的问题是,根据物种之间的距离 ...

  7. P1268 树的重量

    题目描述 树可以用来表示物种之间的进化关系.一棵“进化树”是一个带边权的树,其叶节点表示一个物种,两个叶节点之间的距离表示两个物种的差异.现在,一个重要的问题是,根据物种之间的距离,重构相应的“进化树 ...

  8. P1268 树的重量(板子)

    题目: 题目描述 树可以用来表示物种之间的进化关系.一棵"进化树"是一个带边权的树,其叶节点表示一个物种,两个叶节点之间的距离表示两个物种的差异.现在,一个重要的问题是,根据物种之 ...

  9. 【luogu P1268 树的重量】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1268 给定所有点间的最短路求原图所有路径和 形如: 我们需要计算红边+绿边 绿边 = (红边+蓝边+紫边)/ ...

随机推荐

  1. 动手学习pytorch——(3)多层感知机

    多层感知机(multi perceptron,MLP).对于普通的含隐藏层的感知机,由于其全连接层只是对数据做了仿射变换,而多个仿射变换的叠加仍然是一个仿射变换,即使添加更多的隐藏层,这种设计也只能与 ...

  2. Elasticsearch原理学习--为什么Elasticsearch/Lucene检索可以比MySQL快?

    转载于:http://vlambda.com/wz_wvS2uI5VRn.html 同样都可以对数据构建索引并通过索引查询数据,为什么Lucene或基于Lucene的Elasticsearch会比关系 ...

  3. Apache开启GZIP 压缩网页

    首先我们先了解Apache Gzip的相关资料. 一.gzip介绍 Gzip是一种流行的文件压缩算法,现在的应用十分广泛,尤其是在Linux平台.当应用Gzip压缩到一个纯文本文件时,效果是非常明显的 ...

  4. Fastjson <=1.2.62 远程代码执行-漏洞复现

    影响范围: Fastjson<=1.2.62 需要开启autotype poc: String text1 = "{\"@type\":\"org.apa ...

  5. pytorch -- CNN 文本分类 -- 《 Convolutional Neural Networks for Sentence Classification》

    论文  < Convolutional Neural Networks for Sentence Classification>通过CNN实现了文本分类. 论文地址: 666666 模型图 ...

  6. lwip 2.0.2 snmp mib ipv6

    1.3.6.1.2.1 - SNMP MIB-2 Submitted by Harald.T.Alvestrand at uninett.no from host aun.uninett.no (12 ...

  7. k8s系列---故障

    kubectl get namespace prom Terminating 45h namespace 出现Terminating 状态,一直删不掉 解决: 1:导出namespace的json文件 ...

  8. ORB-SLAM2 论文&代码学习 —— 单目初始化

    转载请注明出处,谢谢 原创作者:Mingrui 原创链接:https://www.cnblogs.com/MingruiYu/p/12358458.html 本文要点: ORB-SLAM2 单目初始化 ...

  9. vux-- Vue.js 移动端 UI 组件库

    1.使用 安装或更新: npm install vux --save npm install vux-loader --save 如果没有安装less: npm install less less-l ...

  10. pycharm(迅雷下载链接)

    pycharm2020迅雷下载链接: https://download.jetbrains.com/python/pycharm-professional-2019.3.3.exe?_ga=2.146 ...