MiniumCut
Description
从前有张图。
图里 n 个顶点两两之间有 $n^2$ 种最小割。
告诉你这 $n^2$ 个最小割。
还原出这张图。
Input
第一行一个正整数 n, 表示图的顶点数。
接下来 n 行每行 n 个非负整数, 第 i 行第 j 列的数表示第 i 个点与第 j 个点的最小割。
点的编号从 1 开始。
$v_{ij}$ ≤ $10^5$ 。
保证 $v_{ii}$ = 0。
Output
第一行一个整数 m, 表示图的边数。
接下来每行三个整数 u,v,z。
表示从 u 到 v 存在一条权值为 z 的边。
$1 ≤ u, v ≤ n$
$0 ≤ z ≤ 10^9 $
$m ≤\frac{n(n-1)}{2}$
请注意你给出的图要求联通。
如果无解请输出 −1。
若有多解则输出任意一组解。
Scoring
对于 10% 的数据, n = 2。
对于 100% 的数据, n ≤ 100。
结论题,一张图最多有$n-1$个不同的最小割,并且可以构造成一颗最小割树,最小割树上两点间边的权值的最小值就是他们的最小割,因此本题只需要构造出最小割树就行了。
每次选取一个最小的最小割,然后这个最小割将树分成两部分,然后用并查集将最小割值大于选取值的点对划分到一个集合中,最后必然形成两个无交的集合,如果只有一个那么无解。然后对两个集合递归求解即可。每次选取出来的最小割和对应点对最终构成一颗最小割树。
如果不知道最小割树可以参考CQOI 2016 不同的最小割
代码:
1 |
|