最小化最大边——kuangbin最短路专题总结(1)

本文介绍了如何使用Kruskal算法思想解决POJ 2253 Frogger和POJ 1797 Heavy Transportation两道题目,涉及寻找路径中最大边的最小值和最小边的最大值。通过将边按权值排序,利用并查集判断起点和终点的连接,找到使起点和终点连接的最后那条边作为答案。同时,文章还探讨了反证法证明算法的正确性,并提及部分题目可以用Floyd或Dijkstra方法实现。
摘要由CSDN通过智能技术生成

POJ 2253 Frogger
POJ 1797 Heavy Transportation

这两道题分别是求起点到终点的所有路径中路径内的最大边的最小值,以及所有路径中最小边的最大值

题目有点绕,但用Kruskal的思想来想就是:
将所有边排序,通过并查集把起点和终点连接起来的过程中,最后一条使起点和终点连接的边的权值就是答案

如下,以Frogger这道题为例
求的是起点到终点的所有路径中路径内的最大边的最小值
我们可以先把所有的边按照从小到大排序
遍历边集E,对每条边的端点u,v,通过并查集将他们表示相连
每次连完后判断起点和终点是否在同一集合里,如果在则输出这次的边权,即为答案

算法的合理性其实很清楚,贪心地从最短的边开始找起,一直到起点终点相连,最后加入的边是此次路径内的边的最大值,就是答案。
严谨的证明可以通过反证或者替代法

下面仅用反证法证明正确性:
记上述算法最后的结果为v,假设有更小的v’满足题意。
则v’在边集E中的顺序一定在v的前面
而有v的定义知,遍历到v’时起点和终点并未相连,因此不满足题意。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int n;
const int maxn = 205;
double x[maxn],y[maxn];
int father[maxn];
int findFather(int x)
{
   
    return x==father[x]?x:father[x] = findFather(father[x]);
}
double getd(int i,int j)
{
   
    double t = (x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
    return sqrt(t);
}
void init()
{
   
    for(int i=1;i
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
并查集是一种常用的数据结构,用于管理一个不相交集合的数据。在并查集中,每个元素都有一个父节点指向它所属的集合的代表元素。通过查找和合并操作,可以判断两个元素是否属于同一个集合,并将它们合并到同一个集合中。 在解决某些问题时,可以使用并查集进行优化。例如,在区间查询中,可以通过优化并查集的查询过程,快速找到第一个符合条件的点。 对于拆边(destroy)操作,一般的并查集无法直接实现这个功能。但是可以通过一个巧妙的方法来解决。首先,记录下所有不会被拆除的边,然后按照逆序处理这些指令。遇到拆边操作时,将该边重新加入并查集中即可。 在实现并查集时,虽然它是一种树形结构,但只需要使用数组就可以实现。可以通过将每个元素的父节点记录在数组中,来表示元素之间的关系。通过路径压缩和按秩合并等优化策略,可以提高并查集的效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [「kuangbin带你飞」专题五并查集专题题解](https://blog.csdn.net/weixin_51216553/article/details/121643742)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [并查集(详细解释+完整C语言代码)](https://blog.csdn.net/weixin_54186646/article/details/124477838)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值