题目描述

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

令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

题解

这道题用了构造的思想。想了很久想不出来,看了题解恍然大悟。

首先如果只有两个点,那么原树就是两个点用他们之间长度的边连起来。【这个很好想到吧】

这个时候我们多了一个点,试想这个点放在哪?
原来的两点已经满足了条件,我们可以不用考虑,我们尝试从两点之间的路径上分出一个分支来插入第三个节点,如图所示:

很容易这样一来,新插入的边长就为(d[1][3] + d[2][3] - d[1][2]) / 2

第四个点呢?
那我们就尝试插入1,3之间,2,3之间1,2之间

对于第i个点就枚举前i-1个点,尝试插入两两之间,选择最小的方案作为最后的答案
就搞完啦~
代码异常的短。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long int
using namespace std;
const int maxn = 35,maxm = 100005,INF = 2000000000; int d[maxn][maxn]; int main(){
int n,ans,t;
while (~scanf("%d",&n) && n){
for (int i = 1; i <= n; i++)
for (int j = i + 1; j <= n; j++)
scanf("%d",&d[i][j]);
ans = d[1][2];
for (int i = 3; i <= n; i++){
t = INF;
for (int j = 1; j < i; j++)
for (int k = j + 1; k < i; k++){
t = min(t,(d[j][i] + d[k][i] - d[j][k]) / 2);
}
ans += t;
}
printf("%d\n",ans);
}
return 0;
}

洛谷P1268 树的重量 【构造 + 枚举】的更多相关文章

  1. 洛谷—— P1268 树的重量

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

  2. 洛谷P1268 树的重量

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

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

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

  4. 洛谷 P1268 树的重量 题解

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

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

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

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

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

  7. P1268 树的重量【构造】

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

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

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

  9. 洛谷P3384 树链剖分

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

随机推荐

  1. 两个字段联合约束(mysql)

    联合约束:ALTER TABLE `lywl_provider_package` ADD unique(providerId,packCode) 给一个表建唯一约束

  2. JS Windows.document对象

    四中选择器:class ,id , name , 标签 通过选择器获取对象: ...................................ClassName('');  -- class选择 ...

  3. 在腾讯云上安装mysql遇到的问题

    卸载mysql: 1.sudo apt-get autoremove --purge mysql-server-5.5 5.5 是数据库版本, mysql -v 显示版本信息 2.sudo apt-g ...

  4. 180725-InfluxDB-v1.6.0安装和简单使用小结

    InfluxDB安装和简单使用小结 InfluxDB是一个时序性数据库,因为工作需求,安装后使用测试下是否支持大数据下的业务场景 说明: 安装最新版本 v1.6.0 集群版本要收费,单机版本免费 内部 ...

  5. fiddler的断点使用

    功能 用于修改数据 1.断点设置请求之前--修改请求数据 2.断点设置在响应时--对响应的数据修改 已中断的会话最前面的图标为红色的带箭头的标志 设置断点方法 1.菜单栏:rules->auto ...

  6. 第四篇 Postman之Pre-request Script(前置处理器:JS之 YYYY-MM-DD HH:MM:SS)

    本篇来讲讲Pre-request Script 前置处理器,定义在发送request之前需要运行的一些脚本,应用场景主要是设置全局变量和环境变量. 本例子也是项目中遇到的,需要修改与客户的预约时间,但 ...

  7. php 操作 oracle lob 数据

    http://www.oracle.com/technetwork/articles/fuecks-lobs-095315.html Working with LOBs in Oracle and P ...

  8. axios封装(一)基础配置

    axios 是目前流行的Promise网络请求库,在浏览器端他通过 xhr方式创建ajax请求.在node环境下,通过 http 库创建网络请求. axios 提供了丰富的配置,这里讲一讲我在工作中通 ...

  9. oracle查询数据库所有用户信息

    看到网上说的查询用户的语句: SELECT * FROM dba_users;这句好像只能系统管理员才能成功执行,普通用户无法执行 SELECT count(*) FROM all_users; , ...

  10. eclipse提示找不到dubbo.xsb报错

    需要下载一个dubbo.xsb文件到本地,并在eclipse中配置 下载路径:下载链接 下载方法: a).带开链接 b).点击[Raw]按钮 c). 右键->另存为 在eclipse中配置xsb ...