题目大意:有一棵树,n个节点,n-1条边,每条边有权值,保证树是强连通的。
如果删掉一条边,在任意两个点之间建一条和该边权值相同的边(仍要保证是连通的,可以与原节点相同),这时任意两点间的距离之和为sum。
问sum最小为多少。
枚举任意一条边,把该点删掉以后再新建一条边,假设把树分为左右两堆,可以发现sum分为三个部分。
1. 左边任意两点的距离和。
2. 右边任意两点的距离和。
3. 左边任一点到右边任意点的距离和。
其中,第三部分仍可以拆分。
假设左边的节点数为numl, 右边节点数为numr;
枚举的这条边在左边的端点为 pointl, 在右边的端点为 pointr.
左边的任一点到pointl 的距离和为 suml, 右边的任一点到 pointr 的距离和为sumr.
可以看到,从左边选一点, 如果该点想到选定右端点需要经历三个部分,
1. 左端点 -> pointl
2. pointl -> pointr
3. pointr -> 右端点
如果是想到达所有的右端点, 这三部分的总和为
1. ( 左端点 -> pointl ) * numr
2. ( pointl -> pointr ) * ( numl * numr )
3. sumr
反之,从右到左也是一样的。
再经过简化 , 每枚举一条边
sum = suml * numr