首页 > 试题广场 >

Shortest Path

[编程题]Shortest Path
  • 热度指数:3 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 128M,其他语言256M
  • 算法知识视频讲解
Today HH becomes a designer, and he faces a problem so he asks you for help.
Treeisland is a country with n cities and n−1 two-way road and from any city you can go to any other cities.
HH the designer is going to design a plan to divide n city into n/2 pairs so that the sum of the length between the n/2 pairs city is minimum.
Now HH has finished it but he doesn't know whether it's true so he ask you to calculate it together.
It's guaranteed that n is even.

输入描述:
The first line contains an positive integer T(1≤T≤100), represents there are T test cases. 
For each test case: The first line contains an positive integer n(1≤n≤104), represents the number of cities in Treeisland, it's guarantee that n is even. 
Then n−1 lines followed. Each line contains three positive integer u, v and len, (u≠v,1≤u≤n,1≤v≤n,1≤len≤109)indicating there is a road of length len between u and v. 
It's guarantee you can get to any city from any city.


输出描述:
For each test case, output in one line an integer, represent the minimum sum of length.
示例1

输入

2
4
1 2 5
2 3 8
3 4 6
6
1 3 5
3 2 3
4 5 4
4 3 9
4 6 10

输出

11
31

说明

In the first example, you can divide them into (1,2), and (3,4), then the minimum sum of length is 5+6=11
In the second example, you can divide them into (1,3),(2,4),(5,6), hen the minimum sum of length is 5+(3+9)+(10+4)=31
 
头像 LB_tq
发表于 2020-04-02 11:59:55
Solution 由题意可知是一个树形结构。若要使两两之间边权最小,尽量不能选重边,也就是说尽可能在节点所在子树里寻找答案。 显然与叶子节点相连的边必须选。然后考虑其他边: 若一棵子树中的节点有偶数个,那么两两配对即可,不用添加新的边权。 若一棵子树有奇数个节点,那么根节点要和其他子树连边,所以还 展开全文
头像 我不会玩锐雯
发表于 2020-04-03 02:30:21
发之前突然在前面加一句,大部分题解都很简单,其实没什么不好,点到点上就行了。只是对萌新来说有点痛苦,所以我写的都比较详细,希望可以帮助到萌新(想起了痛苦的往事),要是还可以的话点个赞呗。另如果发现错误烦请指正。 划重点:Treeisland is a country with n cities an 展开全文
头像 青烟绕指柔
发表于 2020-04-03 12:34:10
其实我们画画图就可以发现,如果把边全部选完,那么一定是有解的。 所以,我们就是删除权值和最多的边,使得原问题还有解。什么是无解呢?就是某个边删除之后,连通块个数为奇数了,那么就不行。 所以直接dfs一次即可,如果当前子树点的个数为偶数个,直接删除即可。 AC代码: #include<bits 展开全文
头像 精神病科黄主任
发表于 2020-04-02 13:02:47
思路:题中给定的是一棵树,要求把分成n/2对 让权值最小看一下范围 在加上是一棵树 所以做法应该是dfs 复杂度为on直接去考虑贡献设当前父节点为x 如果x的子树(包括x自己)的大小是个奇数 意味着什么呢因为要两两配对,那么意味着这奇数个数中,一定有一个数要有外界配对那么他就一定会经过x到x的父节 展开全文
头像 不知名啤酒人
发表于 2020-04-02 14:53:04
Solutionn个点n-1条双向边明显是树,而且保证必定是偶数个节点,那么就肯定是两两配对。就一个节点来说,跟兄弟节点配对,或者跟父亲节点配对肯定是最优的。所以只需要判断节点所在子树里面的节点数是否为偶数,如果是偶数说明不用和此节点的父亲节点配对,若为奇数则需要加上这条边,那么可设 dp[i] 为 展开全文
头像 一只橘橘猫
发表于 2020-04-02 14:59:51
题意:给出一棵有偶数的节点的树,将其分成n/2对点,并且要求n/2对点的路径之和最小 涉及知识点:思维/树上dfs 思路:树上任意两点间的距离是唯一的,题目又要求路径之和最小,所以选择两个节点,要么是父节点和其孩子节点,要么是父节点的两个孩子节点,还有一种情况是多了一个孩子节点,那么肯定要先加上 展开全文
头像 get_right_Lkl
发表于 2020-04-02 15:12:27
这道题其实是codeforces一道题的简化版本。这里放一下cf的题目链接:https://codeforces.ml/contest/1281/problem/E 思路与题解 由于是计算边的贡献,我们可以关注某一条边是否需要被计算在内。如何考虑呢? 容易知道当某一条边的子树中如果有偶数个节点,那么 展开全文
头像 Kur1su
发表于 2020-04-02 16:19:19
Solution Code #pragma GCC optimize(3) #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long long LL; const int N = 1 展开全文
头像 萝卜朝天椒
发表于 2020-04-02 17:27:36
解题思路:只考虑一颗儿子全是叶子的子树时,那么最佳的匹配方案是这些叶子节点两两配对,多余的和根配对。直观感觉这个子树的边全被统计了,而且只统计了一次,如果叶子和非子树的点配对的话,这个子树的边仍然全被统计了,子树根到它父亲的边会被多次统计。按照这个思路,所有边最多只会被统计一次。 现在证明这个方案是 展开全文
头像 wxyww
发表于 2020-04-03 07:25:07
solution 答案的最大值不超过n-1条边的权值之和,当n-1条边全部被选时,我们一定可以找到一种配对方案使得条边只被经过依次。 然后只需考虑哪些边是必须经过的即可,以1为根,如果某条边所连接的子树大小为奇数,那么这个子树内部肯定无法自己进行配对,所以这条边是必须被选的。找到所有这样的边,输出边 展开全文

问题信息

上传者:牛客301599号
难度:
1条回答 1603浏览

热门推荐

通过挑战的用户