UVA 11354 Bond(最小瓶颈路+倍增)
题意:问图上任意两点(u,v)之间的路径上,所经过的最大边权最小为多少?
求最小瓶颈路,既是求最小生成树。因为要处理多组询问,所以需要用倍增加速。
先处理出最小生成树,prim的时间复杂度为O(n*n),kruskal为O(mlogm)。前者适合处理稠密图,后者适合处理稀疏图。
这里的倍增处理是值得记住的,在树上做多组询问;亦或是,将无向图缩点在询问,都是可以这样加速的。
注意:边权<=1e9
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#define clr(a,m) memset(a,m,sizeof(a))
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std; const int MAXN=;
const int INF=1e9;
const int POW =; struct Edge{
int u,v,c;
bool operator < (const Edge rhs)const {
return c>rhs.c;
}
}; priority_queue<Edge>q;
vector<int>G[MAXN];
vector<Edge>edge; int fa[MAXN]; int p[MAXN][POW],Max[MAXN][POW],d[MAXN]; void init(int n)
{
while(!q.empty())
q.pop(); edge.clear();
rep(i,,n)
G[i].clear();
} void add(int u,int v,int c)
{
edge.push_back((Edge){u,v,c});
int m=edge.size();
G[u].push_back(m-);
} int find(int x)
{
return x==fa[x]?x:fa[x]=find(fa[x]);
} void kruskal(int n)
{
int ans=,cnt=;
rep(i,,n)
fa[i]=i;
while(!q.empty())
{
Edge e=q.top();q.pop();
int x=find(e.u);
int y=find(e.v);
if(x!=y){
ans+=e.c;
fa[x]=y;
add(e.u,e.v,e.c);
add(e.v,e.u,e.c);
}
}
} void dfs(int u,int fa,int c)
{
d[u]=d[fa]+;
p[u][]=fa;
Max[u][]=c; rep(i,,POW-){//写rep的原因,忘记-1了,又因为数组开的[POW],下标越界了,不过返回wa实在很无语
p[u][i]=p[p[u][i-]][i-];
Max[u][i]=max(Max[u][i-],Max[p[u][i-]][i-]);//注意下标...写顺手写成Max[Max[u][i-1]][i-1]
}
int sz=G[u].size();
rep(i,,sz-){
Edge e=edge[G[u][i]];
if(e.v==fa)
continue;
dfs(e.v,u,e.c);
}
} int lca( int a, int b )
{
int ans=-INF;
if( d[a] > d[b] ) a ^= b, b ^= a, a ^= b;
if( d[a] < d[b] ){
int del = d[b] - d[a];
for( int i = ; i < POW; i++ )
if(del&(<<i)){
ans=max(ans,Max[b][i]);//注意处理顺序,先取最值,在更新当前点
b=p[b][i];
}
}
if( a != b ){
for( int i = POW-; i >= ; i-- )
if( p[a][i] != p[b][i] ){
ans=max(ans,Max[a][i]);
ans=max(ans,Max[b][i]);
a = p[a][i];
b = p[b][i];
}
ans=max(ans,Max[a][]);
ans=max(ans,Max[b][]);
a = p[a][];
b = p[b][];
}
return ans;
} void LCA(int n)
{
int x,u,v;
clr(p,);
d[]=;
dfs(,,); scanf("%d",&x);
rep(i,,x){
scanf("%d%d",&u,&v);
printf("%d\n",lca(u,v));
}
} int main()
{
int n,m,cnt=;
int u,v,c;
while(~scanf("%d%d",&n,&m))
{
if(cnt++)puts("");
init(n);
rep(i,,m){
scanf("%d%d%d",&u,&v,&c);
q.push((Edge){u,v,c});
}
kruskal(n);
LCA(n);
}
return ;
}
/*
9 8
1 2 10
1 3 20
2 4 20
2 5 30
3 6 30
3 7 10
4 8 30
5 9 10
36
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
2 3
2 4
2 5
2 6
2 7
2 8
2 9
3 4
3 5
3 6
3 7
3 8
3 9
4 5
4 6
4 7
4 8
4 9
5 6
5 7
5 8
5 9
6 7
6 8
6 9
7 8
7 9
8 9
*/
UVA 11354 Bond(最小瓶颈路+倍增)的更多相关文章
- UVA 11354 Bond 邦德 (RMQ,最小瓶颈MST)
题意: n个城市,m条路,每条路有个危险值,要使得从s走到t的危险值最小.回答q个询问,每个询问有s和t,要求输出从s到t最小的危险值.(5万个点,10万条边) 思路: 其实要求的是任意点对之间的最小 ...
- UVa 11354 邦德(最小瓶颈路+LCA)
https://vjudge.net/problem/UVA-11354 题意: 有n个城市m条道路,每条道路有一个危险系数.先在有若干个询问,要求找到一条从s到t的路,使得途径所有边的最大危险系数最 ...
- 最小瓶颈路 Uva 534 Frogger
说明:关于Uva的题目,可以在vjudge上做的,不用到Uva(那个极其慢的)网站去做. 最小瓶颈路:找u到v的一条路径满足最大边权值尽量小 先求最小生成树,然后u到v的路径在树上是唯一的,答案就是这 ...
- 【uva 534】Frogger(图论--最小瓶颈路 模版题)
题意:平面上有N个石头,给出坐标.一只青蛙从1号石头跳到2号石头,使路径上的最长便最短.输出这个值.(2≤N≤200) 解法:最小瓶颈树.而由于这题N比较小便可以用2种方法:1.最短路径中提到过的Fl ...
- CF600 div2 F.Cheap Robot(思维+最短路+最小瓶颈路)
最开始啃这题的时候我还是个不会$lca$的人,看代码看的没有一点头绪,现在趁着寒假补了很多关于图论的知识点,回头在看这题还是有很多值得学习的地方. Solution 1 (offline): 原题解: ...
- UVALive 5713 Qin Shi Huang's National Road System秦始皇修路(MST,最小瓶颈路)
题意: 秦始皇要在n个城市之间修路,而徐福声可以用法术位秦始皇免费修1条路,每个城市还有人口数,现要求徐福声所修之路的两城市的人口数之和A尽量大,而使n个城市互通需要修的路长B尽量短,从而使得A/B最 ...
- uva 11354 - Bond(树链拆分)
题目链接:uva 11354 - Bond 题目大意:给定一张图.每次询问两个节点路径上进过边的危急值的最大值的最小值. 解题思路:首先建立最小生成数,然后依据这棵树做树链剖分. #include & ...
- 【UVA534】Frogger 最小瓶颈路
题目大意:给定一张 N 个点的完全图,求 1,2 号节点之间的一条最小瓶颈路. 题解:可知,最小瓶颈路一定存在于最小生成树(最小瓶颈树)中.因此,直接跑克鲁斯卡尔算法,当 1,2 号节点在同一个联通块 ...
- 【20181102T2】飞越行星带【智商题+最小瓶颈路】
题面 [正解] 一眼不可做啊 --相当于求路线上穿过的点最小距离最大 最小最大--二分啊 现在相当于给一个直径,要判断这个直径是否能从左边穿到右边 我们可以在距离不超过直径的点连一条边,\(y=0\) ...
随机推荐
- HDU 5637 Transform 单源最短路
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5637 题意: http://bestcoder.hdu.edu.cn/contests/contes ...
- [bzoj 2159]Crash的文明世界
今天看到一个鬼题 心情好的时候写 [题意]求树上所有点对距离的k次方和,所有边权为1 大爷方的题解:http://tonyfang.is-programmer.com/posts/204972.htm ...
- [转载]ASP.NET对路径"xxxxx"的访问被拒绝的解决方法小结
异常详细信息: System.UnauthorizedAccessException: 对路径“D:/temp1/MyTest.txt”的访问被拒绝 在windows 2003下,在运行web ...
- 以“图片渐入渐出”为例讲述jQuery插件的具体实现
首先声明,此代码以网友“斯迈欧”原创作为此例的讲解: 在这之前我们先看看我们要做的效果是什么样的: 解析下面的样式:我们要图片在过“一定时间”后自动切换,在右下角处有小方块似数字1,2,3,4,这些数 ...
- php集成开发环境的安装以及Zend Studio开发工具的安装
一.集成开发环境: wampserver 下载地址: 官网: http://www.wampserver.com/ 直接下载 http://sourceforge.net/projects/wamps ...
- **【ci框架】PHP的CI框架集成Smarty的最佳方式
因为CI自带的模板功能不是很方便,所以大家普遍采用集成Smarty的方式来弥补CI这方面的不足. 本人在网上看了不少CI集成Smarty的教程,包括咱们CI论坛里面的一个精华帖子 http://cod ...
- Linux如何修改文件/文件夹内所有文件的权限
一.修改文件权限 修改文件权限前,需要了解一下权限中的”rwx”与数字的对应关系,其中r=4,w=2,x=1. 例如:”drwxr-xr-x”,第一个”d”是代表文件夹,这里不用考虑,后面九个字符,每 ...
- cvc-elt.1: Cannot find the declaration of element---与spring 无关的schema 验证失败
晚上查了好久,都是spring 出这种问题的解决方式,终于查到为什么了. http://wakan.blog.51cto.com/59583/7218/ 转自这个人.. 多谢啦! 为了验证 XML 文 ...
- 欧拉工程第65题:Convergents of e
题目链接 现在做这个题目真是千万只草泥马在心中路过 这个与上面一题差不多 这个题目是求e的第100个分数表达式中分子的各位数之和 What is most surprising is that the ...
- SaaS系列介绍之十五: SaaS知识重用
1 建立并积累自己的开发体系 遵行业界的规定又有自己的特色是我们所追求的目标.成功的软件公司都有丰富而可复用的代码组件,几行代码在单个系统里可能无足轻重,但一旦可在大量的系统中可重复使用那就是价值不菲 ...