并查集+按秩合并

传送门

大意:给出一张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=;
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=;i<=n;i++) f[i]=i,rk[i]=,w[i]=;} 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=;i<=n;i++) wi[i]=;
R ans=,ans1=;
while() { wi[u]=ans; if(f[u]==u) break; ans=max(ans,w[u]),u=f[u];}
while()
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)==)
{
if(cs++) putchar('\n');
init();
for(R i=;i<=m;i++) scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
sort(e+,e+m+,cmp);
for(R i=;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 ;
}

题解 UVA11354 【Bond】的更多相关文章

  1. NOIP2013货车运输[lca&&kruskal]

    题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...

  2. 生成树题目泛做(AD第二轮)

    题目1: NOI2014 魔法森林 LCT维护MST.解题报告见LOFTER #include <cstdio> #include <iostream> #include &l ...

  3. D5 LCA 最近公共祖先

    第一题: POJ 1330 Nearest Common Ancestors POJ 1330 这个题可不是以1为根节点,不看题就会一直wa呀: 加一个找根节点的措施: #include<alg ...

  4. Saving James Bond(dijk)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1245 Saving James Bond Time Limit: 6000/3000 MS (Java ...

  5. 【刷题】洛谷 P4329 [COCI2006-2007#1] Bond

    题意翻译 有 \(n\) 个人去执行 \(n\) 个任务,每个人执行每个任务有不同的成功率,每个人只能执行一个任务,求所有任务都执行的总的成功率. 输入第一行,一个整数 \(n\) ( \(1\leq ...

  6. Configure a VLAN (on top of a bond) with NetworkManager (nmcli) in RHEL7

    not on top of a bond Environment Red Hat Enterprise Linux 7 NetworkManager Issue Need an 802.1q VLAN ...

  7. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  8. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  9. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

随机推荐

  1. 谷歌新操作系统fuchsia

    开源地址: https://github.com/fuchsia-mirror

  2. IntelliJ IDEA 同时启动多个Tomcat实例端口是会冲突

  3. nodejs && apidoc

    1. 安装nodejs      http://www.nodejs.org      源码编译      configure —prefix=/usr/local/nodejs      make ...

  4. sphinx 全文搜索引擎

    sphinx的安装与配置 --------------------------------------------------------------------------------------- ...

  5. jvm file.encoding 属性引起的storm/hbase乱码

    1. 问题 今天为storm程序添加了一个计算bolt,上线后正常,结果发现之前的另一个bolt在将中文插入到hbase中后查询出来乱码.其中字符串是以UTF-8编码的url加密串,然后我使用的URL ...

  6. ACM学习历程—CodeForces 176B Word Cut(字符串匹配 && dp && 递推)

    Description Let's consider one interesting word game. In this game you should transform one word int ...

  7. 设置可见GPU方式

    只可见第一块GPU os.environ["CUDA_VISIBLE_DEVICES"] = "0"

  8. 红黑树的C语言实现

    rbtree.h #ifndef _RED_BLACK_TREE_H_ #define _RED_BLACK_TREE_H_ #define RED 0 // 红色节点 #define BLACK 1 ...

  9. 14 vue学习 postcssrc eslintrc.js babelrc

    一  .postcssrc.js 众所周知为兼容所有浏览器,有的CSS属性需要对不同的浏览器加上前缀,然而有时添加一条属性,需要添加3~4条类似的属性只是为了满足浏览器的兼容,这不仅会增加许多的工作量 ...

  10. S5pv210 HDMI 接口在 Linux 3.0.8 驱动框架解析

    作者:liukun321 咕唧咕唧 日期:2014.1.18 转载请标明作者.出处:http://blog.csdn.net/liukun321/article/details/18452663 本文 ...