#zXSCSybttg030105. 1490:秘密的牛奶运输

1490:秘密的牛奶运输

好的,我将题目中的数字和名称用 ...... 标出。


题目描述

Farmer John 要把牛奶运输到各个销售点。运输过程中,可以先把牛奶运输到一些销售点,再由这些销售点分别运输到其他销售点。
运输的总距离越小,运输成本越低。低成本的运输是 Farmer John 所希望的。
但他不想让竞争对手知道他具体的运输方案,所以他希望采用费用第二小的运输方案而不是最小的。

运输方案可以看作是一棵生成树(连通所有销售点)。
你需要找到总距离第二小的生成树的距离。

注意:第二小生成树是指严格大于最小生成树总权值的最小总权值的生成树。


输入格式

第一行两个整数 N,MN,M,表示顶点数和边数。
接下来 MM 行,每行三个整数 x,y,zx,y,z,表示一条边的两端 x,yx,y 和距离 zz

输出格式

输出一个整数,表示第二小生成树的总距离。


数据范围

  • 1N20001 \le N \le 2000
  • 1M200001 \le M \le 20000
  • 1z1091 \le z \le 10^9
  • 数据可能有重边

输入样例

4 4
1 2 100
2 4 200
2 3 250
3 4 100

输出样例

450

样例解释

图有 44 个顶点 44 条边:

  1. 121-2 : 100100
  2. 242-4 : 200200
  3. 232-3 : 250250
  4. 343-4 : 100100

最小生成树

边按权排序:100,100,200,250100,100,200,250
用 Kruskal:

  • (1,2,100)(1,2,100)
  • (3,4,100)(3,4,100)
  • (2,4,200)(2,4,200),此时已连通 1,2,3,41,2,3,4
    总权值 100+100+200=400100+100+200=400

第二小生成树

考虑替换最小生成树中的一条边,使得总权值增加最少且大于 400400

最小生成树的边集:(1,2,100),(3,4,100),(2,4,200)(1,2,100), (3,4,100), (2,4,200)
尝试替换:

  • 替换 (1,2,100)(1,2,100):可用的非树边中连接 1122 的最小边是 100100(等于原边),不增加权值,不行;其他边 (1,3)(1,3) 不存在,(1,4)(1,4) 不存在。
  • 替换 (3,4,100)(3,4,100):可用的非树边 (2,3)=250(2,3)=250,去掉 (3,4)(3,4) 后,33 通过 22 连通?需要保证连通:去掉 (3,4)(3,4) 后,3344 不连通,加入 (2,3)=250(2,3)=250,则连通。新树权值 = 400100+250=550400 - 100 + 250 = 550
  • 替换 (2,4,200)(2,4,200):可用的非树边 (2,3)=250(2,3)=250,去掉 (2,4)(2,4) 后,4422 不连通,加入 (2,3)(2,3) 后,44 通过 33 连通。新树权值 = 400200+250=450400 - 200 + 250 = 450

最小的严格大于 400400 的权值是 450450


输出 450450


这样题目就完整了,所有数字和名称都用 ...... 标出。