题面描述点此qwq。

正解开始。

一道茅塞顿开恍然大悟的题目:

第一眼看到这个题的时候,语文不好的我对着题目中的

这些,和:

这句话发呆半天,,,,

因为不关我怎么构建几何模型,我都不理解这句话。。

(吐槽题面臃肿!)

然后想了一下,发现题目是这个亚子:

给你一个矩阵M,M上每一个节点(i,j)表示叶子结点i和叶子结点j的距离,每个矩阵有且只能生成唯一一个树(不然这题没法搞了),让你求这棵树上的每一条边的权值和。

在李姐(lz dalao)完题目之后,我又开始懵了。。。。。。到底怎么搞非叶节点的位置???暴力恐怕不行的。。

百思不得其解后,我在绝望中从最简单情况递推:

考虑只有两个(n=2)节点1,2,一条边权值为3

这种情况:

那么,两个节点自然权值就为3了,答案也是3。

一旦跨越到n=3这种情况,就有些棘手。

因为3个节点都是叶子结点,那么必然要在1到2的路径上选一个中间节点来连接3号节点。

(选哪里好呢..?)

因为1到3和2到3的长度都知道了,那么我们可以利用数学方法求助3的位置。

假设M[1][3]=4,M[2][3]=3,那么这两条路径必然有和1到2的路径重复的

那么我们减去重复的,就是3节点到1,2路径的距离了。

如图:

公式:(jz[1][3]+jz[2][3]-jz[1][2])/2=(4+3-3)/2=2.

那么,理解了这个以后,我们可以顺着推n>3的情况:

从之前n-1的情况中找两个点之间的路径,并尝试插入当前节点,然后取min。

节点太多就不画了。。

上代码吧。。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; inline int read()
{
int ans=;
char ch=getchar(),last=' ';
while(ch<''||ch>'')last=ch,ch=getchar();
while(ch>=''&&ch<='')ans=(ans<<)+(ans<<)+ch-'',ch=getchar();
return last=='-'?-ans:ans;
} int n,jz[][]; int main(){
n=read();
while(n!=)
{
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
jz[j][i]=read(),jz[i][j]=jz[j][i];
int ans=jz[][];
for(int i=;i<=n;i++)
{
int dt=0x3f3f3f3f;
for(int j=;j<=i-;++j)
for(int k=;k<=j-;++k)
{
dt=min(dt,(jz[j][i]+jz[k][i]-jz[j][k])>>);
}
ans+=dt;
}
printf("%d\n",ans);
n=read();
}
}

完结。

p1268树的重量 题解的更多相关文章

  1. 洛谷 P1268 树的重量 题解

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

  2. 洛谷P1268 树的重量

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

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

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

  4. 洛谷—— P1268 树的重量

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

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

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

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

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

  7. P1268 树的重量(板子)

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

  8. P1268 树的重量

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

  9. P1268 树的重量【构造】

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

随机推荐

  1. 《ThinkPHP 5.0快速入门》 数据库、查询语言

    1.数据库配置 return [ 'type' => 'mysql',// 数据库类型 'hostname' => '127.0.0.1',// 服务器地址 'database' => ...

  2. char、varchar、nchar、nvarchar四种类型

    char,nchar是定长,如果没达到指定的长度时将自动以英文空格在其后面填充.优势在于速度较高.varchar,nvarchar属于变长,如果没有达到指定的长度时,不会将自动以英文空格在其后面填充. ...

  3. Python全栈开发之6、面向对象

    一.创建类和对象 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例 ...

  4. pyhanlp 繁简转换之拼音转换与字符正则化

    繁简转换 HanLP几乎实现了所有我们需要的繁简转换方式,并且已经封装到了HanLP中,使得我们可以轻松的使用,而分词器中已经默认支持多种繁简格式或者混合.这里我们不再做过多描述. ·说明 · Han ...

  5. kafka安装使用配置1.2

    进入cd /usr/local/flume/conf/ vi kafka.conf 配置 agent.sources=s1 agent.channels=c1 agent.sinks=k1 agent ...

  6. 二项式定理+前缀Sigma

    https://hihocoder.com/problemset/problem/1430 思路: 要用前缀去推Sigma总公式,比较方便.https://blog.csdn.net/weixin_3 ...

  7. A.Who is better?(The Preliminary Contest for ICPC Asia Xuzhou 2019)

    https://nanti.jisuanke.com/t/41383 解: 斐波那契博弈+中国剩余定理. #include <bits/stdc++.h> using namespace ...

  8. pycharm虚拟环境的搭建

    目录 优点 windows 安装 配置虚拟环境管理器工作目录 MacOS.Linux 安装 工作文件 配置 使用 pycharm使用 新建项目 添加环境 使用环境 优点 1.使不同应用开发环境相互独立 ...

  9. MGR+Consul+ProxySQL

    ---------------------------------------------------------------------------------------------------- ...

  10. MySQL之高级增删改查一

    一.select all/distinct 字段名/别名 from table where条件+[1]+[2]+[3]: where条件:>,<,≥,≤,like,between and( ...