题意

给出一张图,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 ;
}

最新文章

  1. Node节点
  2. Quoit Design---hdu1007(最近点对问题 分治法)
  3. apt-get 按照php7后apache 输出php源文件
  4. windows Android 开发环境
  5. M-JPEG和MPEG-4的区别 M-JPEG VS MPEG
  6. 借鉴网上的winform模仿QQ窗口停靠功能稍作改动
  7. tracker-store and tracker-miner-fs eating up my CPU on every startup
  8. java_JDBC字段对应
  9. Go 语言循环语句
  10. python实现ip地址查询经纬度定位
  11. python-web自动化-键盘操作
  12. VPS上拖文件(Apache配置、SSH)
  13. laydate时间组件
  14. python day 25--正则表达式
  15. CSS的显示模式
  16. Sony笔记本
  17. javascript基础拾遗(十二)
  18. [NSURL URLWithString:] returns nil
  19. Win10搜索不能用
  20. JAVA IDE IntelliJ IDEA使用简介(三)—之你不能忘记的快捷键

热门文章

  1. 简单配置prometheus
  2. 实战build-react(三)
  3. UVa 129 Krypton Factor (DFS &amp;&amp; 回溯)
  4. MongoDB操作:flush()
  5. python学习之路(22)
  6. Linux添加用户到sudoers组
  7. Python的datetime与Decimal数据进行json序列化的简单说明
  8. system系统调用返回值判断命令是否执行成功
  9. Linux_Samba详解
  10. Golang基础(4):Go结构体