题意简述
有一个$n$个节点的图,还有$m$条边。找到一颗生成树,使得最大边和最小边之间差最小。
n<=2000,m<=15000,边权<=2e9。
思路框架
边按边权排序;枚举最小边,枚举最大边,直到联通为止$break$。并查集维护。
看起来是$O(m^2)$,但实际情况会快很多。
具体思路
上面没有细讲的,有一个小优化:
我们枚举边$i$,$j$从$i$到$m$枚举最大边。
如果$j=m$了,而且此时图还不连通,就直接整个$break$。因为$i$越大,加入的边越少,就更加不连通了。
而且数据似乎比较水,所以对于每个$i$,往后枚举$n$个$j$左右,图就能完全联通了。所以实际跑起来,复杂度更接近$O(nm)$。
然后这题就水过去了。
代码
1 |
|