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\) ...
随机推荐
- QT for android 比较完美解决 全屏问题
项目用到QT qml,需要在android下面全屏显示,折腾了一晚上,搞定,分享下,希望能帮助他人. 参考 Qt on Android:让 Qt Widgets 和 Qt Quick 应用全屏显示 该 ...
- .run文件安装
比如realplay.run 安装方法如下 chmod +x realplay.run ./realplay.run 然后他就会执行安装了,在过程中可能会要求你输入yes或no 安装完后就可以用了
- uva 10120
bfs搜索 当n大于等于49 是 总是可能的 ~ http://www.algorithmist.com/index.php/UVa_10120 #include <cstdio> #i ...
- android 关于InputDispatcher出现Consumer错误的解决办法
原地址:http://www.educity.cn/wenda/158744.html android 关于InputDispatcher出现Consumer异常的解决方法10-23 03:24:46 ...
- 从后端到页面:如何全方位监控 Ruby 应用?
[编者按]本文参考技术分享 ,由 OneAPM 工程师补充整理,并且已经征得原作者的同意. 为什么选择 OneAPM ? 在性能监控领域,业界比较有名的是 New Relic 还有 Appdynami ...
- 【面试题015】链表中倒数第k个结点
[面试题015]链表中倒数第k个结点 可以用两个指针,当第一个指针指向了第k个时候,第二个指针让他指向链表的第一个元素,然后这两个指针同时向后面移动, 当第一个指针移动到末尾的时候,第二个指针指 ...
- hashtable用法
import java.util.Hashtable; public class HashTable { public static void main (String[] args) { Hasht ...
- cognos8.3 sample在DB2里的安装
db2 create db c83 alias c83 using codeset UTF-8 territory CA 创建sample数据库 db2set db2codepage= db2 cha ...
- lintcode:在O(1)时间复杂度删除链表节点
题目: 在O(1)时间复杂度删除链表节点 给定一个单链表中的表头和一个等待被删除的节点(非表头或表尾).请在在O(1)时间复杂度删除该链表节点.并在删除该节点后,返回表头. 样例 给定 1->2 ...
- Visual StudioTools for Unity 使用技巧2
在之前的博客介绍了 Visual Studio Tools for Unity的安装和使用. http://www.cnblogs.com/petto/p/3886811.html 其实这个工具还提供 ...