题解 UVA11354 【Bond】
并查集+按秩合并
大意:给出一张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】的更多相关文章
- NOIP2013货车运输[lca&&kruskal]
题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...
- 生成树题目泛做(AD第二轮)
题目1: NOI2014 魔法森林 LCT维护MST.解题报告见LOFTER #include <cstdio> #include <iostream> #include &l ...
- D5 LCA 最近公共祖先
第一题: POJ 1330 Nearest Common Ancestors POJ 1330 这个题可不是以1为根节点,不看题就会一直wa呀: 加一个找根节点的措施: #include<alg ...
- Saving James Bond(dijk)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1245 Saving James Bond Time Limit: 6000/3000 MS (Java ...
- 【刷题】洛谷 P4329 [COCI2006-2007#1] Bond
题意翻译 有 \(n\) 个人去执行 \(n\) 个任务,每个人执行每个任务有不同的成功率,每个人只能执行一个任务,求所有任务都执行的总的成功率. 输入第一行,一个整数 \(n\) ( \(1\leq ...
- 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 ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
随机推荐
- zabbix监控系统性能采集指标
监控项目 详细内容 ...
- Ubuntu 更新/安装nodejs
nvm nvm是一个开源的Node版本管理器,通过简单的bash脚本来管理.切换多个Node.js版本.和nvm提供类似功能的还有tj写的n,它们的功能大同小异,整体来说nvm要稍强大一下.值得注意的 ...
- hdmap相关单词
交叉口(junction) 交叉口组(junctiongroup)
- BZOJ 2019 [Usaco2009 Nov]找工作:spfa【最长路】【判正环】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2019 题意: 奶牛们没钱了,正在找工作.农夫约翰知道后,希望奶牛们四处转转,碰碰运气. 而 ...
- Android Studio的技巧
1.快速添加add unimplements methods: 右键generate 2.快速添加try-catch:左边就有一个小电灯,然后可以选. 3.格式化OPTION + CMD + L ( ...
- 【LeetCode】062. Unique Paths
题目: A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). ...
- java定时器,留着用
说明:该定时器作用是 设定定时器首次执行的时间firstTime和执行间隔period,如firstTime=2015-3-25 9:00:00,period=24小时,若程序启动时,已经超过firs ...
- poj3585树最大流——换根法
题目:http://poj.org/problem?id=3585 二次扫描与换根法,一次dfs求出以某个节点为根的相关值,再dfs遍历一遍树,根据之前的值换根取最大值为答案. 代码如下: #incl ...
- 【转】Android Menu
Menu由两种形式,Option menu和Context menu.前者是按下设备的Menu硬按钮弹出,后者是长按widget弹出. Option Menu 当我们按下Menu的硬件按钮时,Opti ...
- hadoop编码问题,mapreduce中Tex与string的转化 乱码问题
引用:http://blog.csdn.net/zklth/article/details/11829563 Hadoop处理GBK文本时,发现输出出现了乱码,原来HADOOP在涉及编码时都是写死的U ...