NSFZOJ #6003. 论战大原题

博客详细介绍了NSFZOJ #6003问题的解决方法,重点在于理解如何利用最大生成树来找出图中第k大的两点间最长路径。博主分享了自己从错误思路到正确理解问题的过程,并阐述了Kruskal算法在解决此问题中的关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NSFZOJ #6003. 论战大原题

题目描述

给定一个 nnn 个点 mmm 条边的无向图。定义一条路径的长度为路径上最小边的权值。定义 dist(i,j)dist(i,j)dist(i,j) 为起点为 iii,终点为jjj 的长度最长的路径的长度。求出第 kkk 大的 dist(i,j)dist(i,j)dist(i,j),其中(i<j)(i<j)(i<j)

输入格式

第一行两个整数 n,m,kn,m,kn,m,k

接下来 mmm 行每行三个整数 u,v,wu,v,wu,v,w,表示uuuvvv 存在一条长度为 www 的无向边。

输出格式

一行一个整数 ansansans,为第kkk 大的 dist(i,j)dist(i,j)dist(i,j)

样例
样例输入 1
4 5 2
1 2 4
4 3 5
2 3 2
4 1 1
3 1 3
样例输出 1
4
样例 1 说明

dist(1,2)=4 dist(1,3)=3 dist(1,4)=3 dist(2,3)=3 dist(2,4)=3 dist(3,4)=5dist(1,2)=4\ dist(1,3)=3\ dist(1,4)=3\ dist(2,3)=3\ dist(2,4)=3\ dist(3,4)=5dist(1,2)=4 dist(1,3)=3 dist(1,4)=3 dist(2,3)=3 dist(2,4)=3 dist(3,4)=5

故第 222 大的 dist(i,j)dist(i,j)dist(i,j)444

样例输入 2
4
样例输出 2
125000004
数据范围与提示

对于 20% 20\% 20% 的数据,0<n≤100 0 < n \le 100 0<n100

对于 50% 50\% 50% 的数据,0<n≤1000 0 < n \le 1000 0<n1000,并满足:

  • 其中有 10% 10\% 10% 的数据,m=n−1m=n-1m=n1;在这中有5% 5\% 5% 的数据,u=v−1u=v-1u=v1
  • 其中有 10% 10\% 10% 的数据随机生成

对于 100% 100\% 100% 的数据,0<n≤105,m≤min(n2,2×105),k≤n(n−1)2 0 < n \le 10^5, m \le \min(n^2,2\times 10^5), k \le \frac{n(n-1)}{2}0<n105,mmin(n2,2×105),k2n(n1),并满足:

  • 其中有 10% 10\% 10% 的数据,k=1k=1k=1
  • 其中有 20% 20\% 20% 的数据,m=n−1m=n-1m=n1;在这中有10% 10\% 10% 的数据,u=v−1u=v-1u=v1
  • 其中有 20% 20\% 20% 的数据随机生成


一开始看到题:不就是最大生成树然后DFS一下?

码完一测:诶呀好像不对?

再一想:emmm,好像较小的边会对较大的边计数产生影响?

无奈查了题解:原来Kruskal过程中就可以解决了?!。。

改完就过了。。

主要思想是,最大生成树合并一条边连接的两个子树时,满足“从两个子树中各选一个点,两点间地简单路径长度即为这条边的长度“,同时满足”除此以外所有的点对间简单路径长度都不等于这条边的长度“。这条性质用最大生成树构造过程就能解释:每次选当前最大的边,也就是说已经选过的边都比这条边大。然后就没有然后了。。


代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值