UVA 11354 Bond 最小生成树 + lca
题意
给出一张图,q个询问,每次询问给出uv,找出一条路径,使这条路径上的最大边权是两点所有路径中最小,输出这个值
思路
很显然要先求出最小生成树,任意两点在最小生成树上有唯一路径,并且这条路径上的最大边权就是所输出的值,接下来就是如何求出树上任意两点唯一路径中的最大边权了,先把最小生成树转化为有根树,并用fa数组表示u的父亲节点,cost数组表示与父亲节点连的边的边权,dep数组表示这个点的深度,对于每次查询,先把两点的深度调到一样大,同时更新最大边,然后一起向上搜索直到两点的最近公共祖先,同时也更新最大边。这就是最朴素的求LCA的方法。
C++代码
#include <bits/stdc++.h>
using namespace std; const int maxn = 1e5 + ; struct Edge{
int from,to;
int w,nxt;
}edge[maxn << ],e[maxn << ]; int n , m ;
int pre[maxn];
int fa[maxn],cost[maxn],dep[maxn];
int head[maxn],tot; void init(){
tot = ;
memset(head,-,sizeof head);
for(int i = ;i <= n ; i++){
pre[i] = i;
}
} bool cmp(Edge a,Edge b){
return a.w < b.w;
} void add_edge(int u ,int v,int w){
e[tot].from = u;
e[tot].to = v;
e[tot].w = w;
e[tot].nxt = head[u];
head[u] = tot ++;
} inline int find(int x){if(x == pre[x])return x;else return pre[x] = find(pre[x]);} void kruskal(){
sort(edge+,edge++m,cmp);
int fu,fv,u,v;
for(int i = ;i <= m; i++){
u = edge[i].from;
v = edge[i].to;
fu = find(u);
fv = find(v);
if(fu != fv){
pre[fu] = fv;
add_edge(u,v,edge[i].w);
add_edge(v,u,edge[i].w);
}
}
} void dfs(int u,int Fa,int step){
int v;
for(int i = head[u]; ~i ;i = e[i].nxt){
v = e[i].to;
if(v ==Fa) continue;
dep[v] = step;
fa[v] = u;
cost[v] = e[i].w;
dfs(v,u,step + );
}
} int lca(int u,int v){
int du = dep[u];
int dv = dep[v];
int res = ;
while(du > dv){
res = max(res,cost[u]);
u = fa[u];
du --;
}
while(dv > du){
res = max(res,cost[v]);
v = fa[v];
dv --;
}
while(u != v){
res = max(res,cost[u]);
res = max(res,cost[v]);
u = fa[u];
v = fa[v];
}
return res;
} int main(){
int cas = ;
while(cin >> n >> m){
if(cas) puts("");
else cas ++;
init();
for(int i = ;i <= m; i ++){
int u , v , w;
cin >> u >> v >> w;
edge[i].from = u;
edge[i].to = v;
edge[i].w = w;
}
//cout << 1 ;
kruskal();
fa[] = cost[] = dep[] = ;
dfs(,-,);
int q;
cin >> q;
while(q--){
int u , v ;
cin >> u >> v;
cout << lca(u,v) << endl;
}
}
return ;
}
UVA 11354 Bond 最小生成树 + lca的更多相关文章
- UVA 11354 - Bond (最小生成树 + 树链剖分)
题目链接~~> 做题感悟:这题開始看到时感觉不是树不优点理,一想能够用 Kruskal 处理成树 ,然后就好攻克了. 解题思路: 先用 Kruskal 处理出最小生成树.然后用树链剖分 + 线段 ...
- 训练指南 UVA - 11354(最小生成树 + 倍增LCA)
layout: post title: 训练指南 UVA - 11354(最小生成树 + 倍增LCA) author: "luowentaoaa" catalog: true ma ...
- uva 11354 - Bond(树链拆分)
题目链接:uva 11354 - Bond 题目大意:给定一张图.每次询问两个节点路径上进过边的危急值的最大值的最小值. 解题思路:首先建立最小生成数,然后依据这棵树做树链剖分. #include & ...
- UVA - 11354 Bond(最小生成树+LCA+瓶颈路)
题意:N个点,M条路,每条路的危险度为路上各段中最大的危险度.多组询问,点s到点t的所有路径中最小的危险度. 分析: 1.首先建个最小生成树,则s到t的路径一定是危险度最小的. 原因:建最小生成树的最 ...
- UVA 11354 Bond(MST + LCA)
n<=50000, m<=100000的无向图,对于Q<=50000个询问,每次求q->p的瓶颈路. 其实求瓶颈路数组maxcost[u][v]有用邻接矩阵prim的方法.但是 ...
- UVA 11354 Bond(最小瓶颈路+倍增)
题意:问图上任意两点(u,v)之间的路径上,所经过的最大边权最小为多少? 求最小瓶颈路,既是求最小生成树.因为要处理多组询问,所以需要用倍增加速. 先处理出最小生成树,prim的时间复杂度为O(n*n ...
- uva 11354 Bond
题意: 邦德在逃命!他在一个有N个城市,由M条边连接的道路网中.一条路的危险度被定义为这条路上危险度最大的边的危险度. 现在给出若干个询问,s,t,问从s到t的最小的危险度是多少. 思路: 首先可以证 ...
- UVA 11354 Bond 邦德 (RMQ,最小瓶颈MST)
题意: n个城市,m条路,每条路有个危险值,要使得从s走到t的危险值最小.回答q个询问,每个询问有s和t,要求输出从s到t最小的危险值.(5万个点,10万条边) 思路: 其实要求的是任意点对之间的最小 ...
- Bond UVA - 11354(LCA应用题)
Once again, James Bond is on his way to saving the world. Bond's latest mission requires him to trav ...
随机推荐
- luoguP1774 最接近神的人_NOI导刊2010提高(02)x
P1774 最接近神的人_NOI导刊2010提高(02) 题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门 ...
- 【转】Django之Model层的F对象,Q对象以及聚合函数
转自:https://blog.csdn.net/wsy_666/article/details/86692050 一.F对象: 作用:用于处理类属性(即model的某个列数据),类属性之间的比较.使 ...
- 【Mark】博弈类题目小结(HDU,POJ,ZOJ)
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove 首先当然要献上一些非常好的学习资料: 基础博弈的小 ...
- 满减 HRBUST - 2455
https://vjudge.net/problem/HRBUST-2455 有两种优惠方式,一是满400减100,另外一种是商品自带折扣,二者不可叠加 dp[i][j]表示前i种商品,(参与满400 ...
- python 正则之字母匹配
\A:匹配字符串的开始 \b:匹配一个单词边界 取出a边界单词的个数 >>> len(re.findall(r"\ba"," ab abc ad ...
- jdbcType="DATE"和jdbcType=" TIMESTAMP"的区别
原文: https://www.cnblogs.com/fswhq/p/jdbcType.html 当传入null值时,jdbcType 会防止null空指针异常报错 Mybatis 中jdbcTyp ...
- vmware fusion 找不到可以连接的有效对等进程
红框会有什么提示 vmware...,你点击允许
- leetcode-easy-array-48. Rotate Image-NO
mycode 思路:第m行要变到 - 1- m 列 ,但是没有再想一步即列变为行,这样每一个位置的变换方式就出来了 难点:如何不使用额外空间呢? 参考: 思路:找到矩阵旋转和转置之间的联系,转置是可以 ...
- 【linux】cp 批量复制文件
[需求]: 有2个文件夹a,b,现在需要将a文件夹下的所有文件(aa.py,a2.py,a3.py)都复制到b文件夹(空文件夹) [解决办法]: 首先想到的是使用正则表达式,但是发现在linux中,只 ...
- 快速入门分布式消息队列之 RabbitMQ(3)
目录 目录 前文列表 前言 通道 Channel 一个基本的生产者消费者实现 消费者 生产者 运行结果 应用预取计数 应用 ACK 机制 最后 前文列表 快速入门分布式消息队列之 RabbitMQ(1 ...