并查集+按秩合并

传送门

大意:给出一张n个点m条边的无向图, 每条边有一个权值,有q个询问, 每次给出两个点s、t,找一条路, 使得路径上的边的最大权值最小。

我们可以发现,跑最小生成树会跑挂, 那么任意两点, 在生成树上有唯一路径, 而且这条路径上的最大危险值一定最小。 但是每次询问最大复杂度O(n), 那么复杂度高达O(n^2)。 我们知道, 并查集在用了路径压缩之后效率高达O(n), 但是却破坏了树形结构, 所以不能用路径压缩。 然而仅仅靠按秩合并, 复杂度也可低至O(logn)。 因此我们只需按秩合并, 然后询问的时候向根回溯就行了, 复杂度mlogn。

#include<cstdio>
#include<cctype>
#include<algorithm>
#include<cstring>
#define R register int
using namespace std;
const int N=50010;
int f[N],rk[N],w[N],wi[N];
int n,m,t,u,v,cs;struct edge{int u,v,w;
}e[N];inline bool cmp(const edge& x,const edge& y) {return x.w<y.w;}void init() {for(R i=0;i<=n;i++) f[i]=i,rk[i]=0,w[i]=0;}inline int getf(int i) {return f[i]==i?i:getf(f[i]);}inline void merge(int u,int v,int wi)
{u=getf(u),v=getf(v);if(u==v) return ;if(rk[u]<rk[v]) f[u]=v,w[u]=wi;else {f[v]=u,w[v]=wi;if(rk[u]==rk[v]) rk[u]++;}
}inline int solve(int u,int v)
{for(R i=0;i<=n;i++) wi[i]=0;R ans=1,ans1=0;while(1) { wi[u]=ans; if(f[u]==u) break; ans=max(ans,w[u]),u=f[u];}while(1)if(wi[v]) {ans1=max(ans1,wi[v]); break;}else if(f[v]==v) break;else ans1=max(ans1,w[v]),v=f[v];    return ans1;
}int main()
{while(scanf("%d%d",&n,&m)==2){if(cs++) putchar('\n');init();for(R i=1;i<=m;i++) scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);sort(e+1,e+m+1,cmp);for(R i=1;i<=m;i++) merge(e[i].u,e[i].v,e[i].w);scanf("%d",&t);while(t--){scanf("%d%d",&u,&v);printf("%d\n",solve(u,v));}    }return 0;
}

转载于:https://www.cnblogs.com/Jackpei/p/10381419.html

题解 UVA11354 【Bond】相关推荐

  1. [JS][dfs]题解 | #迷宫问题#

    题解 | #迷宫问题# 题目链接 迷宫问题 题目描述 定义一个二维数组 N*M ,如 5 × 5 数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1 ...

  2. [JS][dp]题解 | #打家劫舍(一)#

    题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...

  3. [JS]题解 | #魔法数字#

    题解 | #魔法数字# 题目链接 魔法数字 题目描述 牛妹给牛牛写了一个数字n,然后又给自己写了一个数字m,她希望牛牛能执行最少的操作将他的数字转化成自己的. 操作共有三种,如下: 在当前数字的基础上 ...

  4. [JS]题解 | #岛屿数量#

    题解 | #岛屿数量# 题目链接 岛屿数量 题目描述 时间限制:1秒 空间限制:256M 描述 给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛.我们只考虑上下左右 ...

  5. [JS] 题解:提取不重复的整数

    题解:提取不重复的整数 https://www.nowcoder.com/practice/253986e66d114d378ae8de2e6c4577c1 时间限制:1秒 空间限制:32M 描述 输 ...

  6. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  7. [洛谷1383]高级打字机 题解

    题解 这道题一看就珂以用主席树啊 这是一道神奇的题目,那么我们先敲一个主席树,然后维护一个数组len,表示下一次应该在len + 1插入, 之后对于T操作,在上一个版本的len + 1上直接执行插入 ...

  8. luogu P1549 棋盘问题(2) 题解

    luogu P1549 棋盘问题(2) 题解 题目描述 在\(N * N\)的棋盘上\((1≤N≤10)\),填入\(1,2,-,N^2\)共\(N^2\)个数,使得任意两个相邻的数之和为素数. 例如 ...

  9. 【题解搬运】PAT_L1-009 N个数求和

    从我原来的博客上搬运.原先blog作废. (伪)水题+1,旨在继续摸清这个blog(囧 题目 就是求N个数字的和.麻烦的是,这些数字是以有理数"分子/分母"的形式给出的,你输出的和 ...

最新文章

  1. ikvm Java中异常_使用IKVMC将Java转换为.NET库 – 警告IKVMC0108:...
  2. .Net Framework 4.0 中利用Task实现并行处理、串并行混合处理
  3. 语法转换_语法 | 句型转换之肯定句变否定句
  4. 互联网1分钟 | 0214 2018 年超1/3的婚姻由约会交友类App促成;刘强东新开设 “南京京东云计算有限公司”...
  5. linux 连接wifi不稳定,rtl8188ce 无线网不稳定终极解决方案 - 哆啦比猫的技术瞎扯 - Arch Linux · ドラえもん · 实时绘制...
  6. Linux Vim显示行号方法详解
  7. Python数据处理 PCA/ZCA 白化(UFLDL教程:Exercise:PCA_in_2DPCA_and_Whitening)
  8. 本周论文推荐(12.14-12.20)
  9. 创建maven web项目无法创建sec目录
  10. python有哪几种数据结构_Python最常用的数据结构6种
  11. MES管理系统应用环境分析,以及实施面临的挑战
  12. modules node 太大了_解决node_modules文件名太长无法删除的两个方法-文件名太长
  13. GBase 8c 数据库产品简介
  14. PDF工具Adobe Arcrobat Pro DC下载安装教程
  15. android桌面动画
  16. Python利用PyQt5制作一个获取网络实时数据NBA数据播报GUI
  17. 各类文件的文件头标志[转]
  18. 信号与系统——信号的分解
  19. HDU 5446 Unknown Treasure(Lucas定理+CRT)
  20. Linux ALSA 之二:ALSA 声卡与设备

热门文章

  1. JavaScript 函数创建思想
  2. hdu 2795 段树--点更新
  3. 【十五分钟Talkshow】fmplan(十五分钟计划)的初步想法
  4. CorelDRAW快捷键搜集
  5. 构建一个react项目_您想要了解更多有关React的内容吗? 让我们构建一个游戏,然后玩。...
  6. 需求简报_代码简报:有史以来最怪诞的丑毛衣
  7. PAT(甲级)2019年春季考试 7-3 Telefraud Detection
  8. 1007 Maximum Subsequence Sum(两种思路)
  9. UI设计培训中的扁平化理念
  10. 零基础如何学习java技术?