P1268 树的重量

    • 85通过
    • 141提交
  • 题目提供者该用户不存在
  • 标签树形结构
  • 难度提高+/省选-

提交该题 讨论 题解 记录

最新讨论

  • 有这种情况吗!!!!
  • 题意似乎有问题

题目描述

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

令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-l行,给出的是矩阵M的一个上三角(不包含对角线),矩阵中所有元素是不超过100的非负整数。输入数据保证合法。

输入数据以n=0结尾。

输出格式:

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

输入输出样例

输入样例#1:

5
5 9 12 8
8 11 7
5 1
4
4
15 36 60
31 55
36
0
输出样例#1:

15
71

分析:这种求一大堆数相加的题目显然不好直接下手,遇到这类问题先把数据化小,先假设n=1,直接输出0即可......如果n=2,两个点分别为a,b,那么答案就是a,b的距离,如果有3个点呢?假设这个点为c,因为所有的点都是叶子节点,那么c一定是在a,b的路径上的分叉的路径上:(画的丑轻喷......),设d(i,j)为i到j的距离,那么答案就是(d(a,c) + d(b,c) - d(a,b)) / 2 + d(a,b),如果多余3个节点呢?这个时候就必须要做一点特殊处理,把a当作一个“根”节点,因为所有的点都是连通的,那么j一定可以通过一条路径连接到a-i的路径上,那么再加一个点D,,可以发现答案其实就是3条线的和,但是我们只知道任意两个点之间的距离,怎么计算线呢?其实可以利用n=3的算法,答案为(d(a,c) + d(b,c) - d(a,b)) / 2 + d(a,b) + (d(a,d) + d(c,d) - d(a,c)) / 2这个时候要特别注意D是从哪条路径上分叉的,如果是从AB上分叉的可以发现会多算条路径(红色部分)怎么样才能不多算呢?其实可以发现,如果多加一个点,那么就要多计算一条路径,而这条路径就是最近的一条边分叉出来的,那么枚举边,计算最小值即可,同时要把A当作“根”节点,便于计算距离.

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; const int maxn = ,inf = 1e18; int n,d[maxn][maxn],ans,temp; int main()
{
while (scanf("%d", &n) && n)
{
for (int i = ; i <= n; i++)
for (int j = i + ; j <= n; j++)
{
scanf("%d", &d[i][j]);
d[j][i] = d[i][j];
}
ans = d[][];
for (int i = ; i <= n; i++)
{
temp = inf;
for (int j = ; j < i; j++)
temp = min(temp, (d[][i] + d[j][i] - d[][j]) / );
ans += temp;
}
printf("%d\n", ans);
} return ;
}

洛谷P1268 树的重量的更多相关文章

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

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

  2. 洛谷—— P1268 树的重量

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

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

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

  4. 洛谷 P1268 树的重量 题解

    题面 目的:求出树的各边长度 条件:每个节点之间最短路.整个图中不存在负边 我们可以每一次把一个点加入树内,求出这个点和已经构建好的树的边的长度: 这个长度抽象理解一下就是(dis[i][j]+dis ...

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

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

  6. 【算法学习】【洛谷】树链剖分 & P3384 【模板】树链剖分 P2146 软件包管理器

    刚学的好玩算法,AC2题,非常开心. 其实很早就有教过,以前以为很难就没有学,现在发现其实很简单也很有用. 更重要的是我很好调试,两题都是几乎一遍过的. 介绍树链剖分前,先确保已经学会以下基本技巧: ...

  7. 洛谷P3384 树链剖分

    如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式: 2 x ...

  8. P1268 树的重量

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

  9. P1268 树的重量【构造】

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

随机推荐

  1. 【Android学习日记】

    (一) Android 开发基础 1 Android平台的特性 1)  应用程序框架支持组建的重用和替换,包括打电话应用程序.文件管理器等. 2)  Dalvik虚拟机专门为移动设备做了优化,Dalv ...

  2. activiti自定义流程之自定义表单(三):表单列表及预览和删除

    注:(1)环境配置:activiti自定义流程之自定义表单(一):环境配置 (2)创建表单:activiti自定义流程之自定义表单(二):创建表单 自定义表单创建成功,要拿到activiti中使用,自 ...

  3. 3. Map与Tuple

    一. Map 对偶 (1)对偶是一个映射.多个对偶形成map (2)对偶的表示:(k,v)或者k->v Map(哈希类型) (1)map的声明与查询 scala> val map1 = M ...

  4. Tomcat远程调试catalina.sh的配置

    #!/bin/sh # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license ...

  5. Google glog 使用

    Google glog 使用 1        简介 Googleglog 库实现了应用级的日志记录,提供了C++ 风格的流操作和各种助手宏. 代码示例: #include <glog/logg ...

  6. 使用jackson进行json数据格式转换

    private static final JsonFactory factory = new JsonFactory(); StringWriter jsonOut = new StringWrite ...

  7. protobuf使用说明

    1..proto文件为要生成.java文件的模板文件,其中包含名称空间.文件名等信息2.cmd中进入当前目录D:\JAVA\protoc-2.5.0-win323.运行 protoc.exe --ja ...

  8. ICE安装

    第一步,基于Windows下的安装,所以下载windows版的Ice: http://www.zeroc.com/download       第二步,安装Ice: 常规安装即可,可以选择安装目录,本 ...

  9. Vim 中截取部分内容保存到其他文件

    最近无聊,突然想跟着玩玩天池数据挖掘,发现数据好大,想转换到mysql数据库,phpmyadmin import 导入时抱错! 数据文件大大! 于是乎,准备截取一小段到另外一个文件测试先,然后,发现了 ...

  10. RSpec自定义matcher

    链接 https://relishapp.com/rspec/rspec-expectations/v/3-4/docs/custom-matchers/define-a-custom-matcher ...