原题传送门

方法一

这道题是贪心。主要的难点在于合并路径压缩长度的策略。这里采用的方法是让一个个结点并入已经构建好的树中,并记录该结点接入树的位置、接入树到该结点的长度。模拟注意细节即可。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5
 6 using namespace std;
 7
 8 #define re register
 9 #define rep(i, a, b) for (re int i = a; i <= b; ++i)
10 #define repd(i, a, b) for (re int i = a; i >= b; --i)
11 #define maxx(a, b) a = max(a, b);
12 #define minn(a, b) a = min(a, b);
13 #define LL long long
14 #define inf (1 << 30)
15
16 inline int read() {
17     int w = 0, f = 1; char c = getchar();
18     while (!isdigit(c)) f = c == '-' ? -1 : f, c = getchar();
19     while (isdigit(c)) w = (w << 3) + (w << 1) + (c ^ '0'), c = getchar();
20     return w * f;
21 }
22
23 const int maxn = 30 + 5, maxw = 100 + 5;
24
25 int N, M[maxn][maxn], link[maxn][maxw], l[maxn], ans;
26
27 int main() {
28     while (N = read()) {
29         memset(M, 0, sizeof(M));
30         memset(link, 0, sizeof(link));
31         memset(l, 0, sizeof(l));
32         rep(i, 1, N-1)
33             rep(j, i+1, N)
34                 M[i][j] = M[j][i] = read();
35         l[2] = M[1][2];
36         rep(i, 3, N) {
37             l[i] = M[1][i];
38             int p = 2, q = 0;
39             while (1) {
40                 int del = min((l[i] + l[p] - q - M[i][p]) >> 1, l[i]);
41                 q += del; l[i] -= del;
42                 if (link[p][q]) p = link[p][q], q = 0; else break;
43             }
44             while (link[p][q]) p = link[p][q], q = 0;
45             link[p][q] = i;
46         }
47         ans = 0;
48         rep(i, 2, N) ans += l[i];
49         printf("%d\n", ans);
50     }
51
52     return 0;
53 }

方法二

将以上方法进行抽象简化,不再模拟,直接统计即可。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5
 6 using namespace std;
 7
 8 #define re register
 9 #define rep(i, a, b) for (re int i = a; i <= b; ++i)
10 #define repd(i, a, b) for (re int i = a; i >= b; --i)
11 #define maxx(a, b) a = max(a, b);
12 #define minn(a, b) a = min(a, b);
13 #define LL long long
14 #define inf (1 << 30)
15
16 inline int read() {
17     int w = 0, f = 1; char c = getchar();
18     while (!isdigit(c)) f = c == '-' ? -1 : f, c = getchar();
19     while (isdigit(c)) w = (w << 3) + (w << 1) + (c ^ '0'), c = getchar();
20     return w * f;
21 }
22
23 const int maxn = 30 + 5;
24
25 int n, e[maxn][maxn], ans;
26
27 int main() {
28     while (n = read()) {
29         ans = 0;
30         rep(i, 1, n-1)
31             rep(j, i+1, n)
32                 e[i][j] = e[j][i] = read();
33         rep(i, 2, n) {
34             int l = INF;
35             rep(j, 1, i-1)
36                 l = min(l, e[1][i] - ((e[1][i] + e[1][j] - e[i][j]) >> 1));
37             ans += l;
38         }
39         printf("%d\n", ans);
40     }
41
42     return 0;
43 }

转载于:https://www.cnblogs.com/ac-evil/p/10322307.html

[洛谷P1268]树的重量相关推荐

  1. 洛谷—— P1268 树的重量

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

  2. 洛谷1268树的重量(树)

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

  3. 洛谷 P1411 树

    最近在做些树形DP练练手 原题链接 大意就是给你一棵树,你可以断开任意数量的边,使得剩下的联通块大小乘积最大. 样例 8 1 2 1 3 2 4 2 5 3 6 3 7 6 8 输出 18 我首先想的 ...

  4. 洛谷 - P3374 树状数组1

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 将某一个数加上 xx 求出某区间每一个数的和 输入格式 第一行包含两个正整数 n,mn,m,分别表示该数列数字的个数和操作的总个数. 第二行包含 ...

  5. 洛谷 P3374 树状数组模板1

    题目大意 给出一个初始数组,有两种操作,一种是将第x个数加上k,一种是求[x,y]区间和. 题目分析 直接暴力肯定TLE,我们可以用简单线段树或者树状数组优化,这里作者就采用简单线段树通过 #incl ...

  6. 洛谷.P3374 树状数组

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 将某一个数加上 x 求出某区间每一个数的和 输入格式 第一行包含两个正整数 n,m分别表示该数列数字的个数和操作的总个数. 第二行包含 n 个用 ...

  7. 洛谷P1873-砍树(二分答案)

    题目描述: 伐木工人米尔科需要砍倒M米长的木材.这是一个对米尔科来说很容易的工作,因为他有一个漂亮的新伐木机,可以像野火一样砍倒森林.不过,米尔科只被允许砍倒单行树木. 米尔科的伐木机工作过程如下:米 ...

  8. 洛谷P3384 - 树链剖分(树链剖分模板题)

    题目链接 https://www.luogu.org/problemnew/show/P3384 [描述] 树链剖分模板题,记一下板子 #include<bits/stdc++.h> #d ...

  9. 洛谷 [P2590] 树的统计

    迷之TLE #include <iostream> #include <cstdio> #include <cstring> #include <algori ...

最新文章

  1. Flutter开发之《头条 Flutter iOS 混合工程实践》笔记(54)
  2. tensorflow环境下的识别食物_Tensorflow object detection API 搭建属于自己的物体识别模型——环境搭建与测试...
  3. Dynpro F4的实现测试
  4. python2.7下面字节数组(ByteArray)和16进制字符串(HexString)转化
  5. 如何 更换vue的图标_vue如何实现图标点击选中后换一个图标(只单选)
  6. logging模块(* * * * *)
  7. wcf rest服务启用gzip压缩
  8. Reset Image Size 2
  9. 使用samba完成Linux服务器与Windows之间的映射
  10. 爬虫:爬取网页表格内容,写入scv文件并绘图
  11. WebRTC音频处理流程简介
  12. 萝卜内存对比工具使用说明
  13. 整数逆序输出, 例如输入一个整数12345,输出5 4 3 2 1
  14. Idear创建Maven项目
  15. Web Services Ksoap 下载多张图片
  16. C/C++实现双目矫正(不使用OpenCV内部函数)及矫正源码解析
  17. vue 使用vue-canvas-poster生成自定义海报
  18. 第十二章 洗筋伐髓
  19. 高清视音监控系统的实现
  20. 磁盘类型转换(fat转换ntfs)

热门文章

  1. Linux下杀毒软件Clamav的安装和使用
  2. Fabric环境搭建
  3. 前端工程师要懂些什么
  4. 电脑图标有阴影如何去除
  5. 分布式查询的使用准则
  6. Yii学习笔记:利用setFlash和runController打造个性化的提示信息页面
  7. Hyper-V 3.0部署PART 14:准备仲裁磁盘
  8. Android 求圆的面积
  9. linux 自学系列:wc命令
  10. [转载]开源网管软件对比 - Nagios OpenNMS Zenoss