题号:NC231655
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld
题目描述
你有一个

个点

条边的带权无向图

(不一定连通),现在有

个关键点

,请设计一种方案,将这些点分成若干个大小大于

的集合

,且任意一个关键点至少要在某一个集合中,那么可以定义集合

的价值:
1. 将

中的所有元素按某一方式排列得到序列

.
2. 对于

和
)
,需要在原图中找到一条从

到

的**简单路径**(即不经过重复点的路径),同时也要找一条从

到

的简单路径,并记录路径上每条边的经过次数。
3. 集合

的价值

为

(

为该边边权,即经过这条边奇数次,其贡献为

,否则为

)。
如果这种方案划分出了

个集合,那么该方案的花费是

.
求花费最小的方案的花费。
保证这

个关键点中,每一个点至少可以通向另外一个点。
输入描述:
第一行三个整数
,含义如题面所述。
第二行
个整数
,表示
个关键点。
接下来
行,每行三个整数
,表示一条在结点
和
之间,边权为
的无向边。
(
,没有自环和重边)
输出描述:
一个整数,即题目中所求的最小花费。
示例1
输入
复制
8 7 6
1 5 4 6 8 7
2 5 3
1 4 4
5 3 1
6 3 8
3 7 5
2 8 9
2 3 6
说明
可分成两个集合

.在集合

中,可以构造序列

,选择路径

,这样每条边都走了两次,因此

;在集合

中,构造序列

,选择路径

,这样这条边也走了两次,因此

.那么答案就是

,可以证明,这是所求的最小值。