题目:https://www.luogu.org/problemnew/show/P1967

就是倍增LCA的裸题,注意一些细节即可。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int const MAXN=,MAXM=,inf=1e9;
int n,m,q,dep[MAXN],pre[MAXN][],mn[MAXN][],ct1,ct=,head[MAXN];
int fa[MAXN],ans;
struct N{
int hd,to,next,w;
N(int h=,int t=,int n=,int w=):hd(h),to(t),next(n),w(w) {}
}edge[MAXM<<],ed[MAXM<<];
int find(int x)
{
if(x==fa[x])return x;
return fa[x]=find(fa[x]);
}
void add(int x,int y,int z)
{
edge[++ct]=N(x,y,head[x],z);head[x]=ct;
edge[++ct]=N(y,x,head[y],z);head[y]=ct;
}
void add1(int x,int y,int z)
{
ed[++ct1]=N(x,y,,z);
}
bool cmp(N x,N y){return x.w>y.w;}
void kruskal()
{
sort(ed+,ed+ct1+,cmp);
for(int i=,u,v;i<=ct1;i++)
{
u=ed[i].to;
v=ed[i].hd;
int a=find(u);
int b=find(v);
if(a!=b)
{
add(u,v,ed[i].w);
fa[a]=b;
}
}
}
void dfs(int x,int f)
{
dep[x]=dep[f]+;
pre[x][]=f;
for(int i=head[x],u;i;i=edge[i].next)
{
u=edge[i].to;
if(u==f)continue;
mn[u][]=edge[i].w;
dfs(u,x);
}
}
void lca(int x,int y)
{
int ans=inf;
if(dep[x]>dep[y])swap(x,y);
int d=dep[y]-dep[x];
for(int i=;i<=;i++)
if((d>>i)&)ans=min(ans,mn[y][i]),y=pre[y][i];//不是i-1!
if(x==y)
{
printf("%d\n",ans);
return;
}
for(int i=;i>=;i--)//不是i>0
{
if(pre[x][i]!=pre[y][i])
{
ans=min(ans,min(mn[x][i],mn[y][i]));
x=pre[x][i];y=pre[y][i];
}
}
ans=min(ans,min(mn[x][],mn[y][]));
printf("%d\n",ans);
}
int main()
{
int x,y,z;
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
scanf("%d%d%d",&x,&y,&z),add1(x,y,z);
for(int i=;i<=n;i++)fa[i]=i;
kruskal();
for(int i=;i<=n;i++)
if(!dep[i])dfs(i,);
for(int j=;j<=;j++)
for(int i=;i<=n;i++)
{
pre[i][j]=pre[pre[i][j-]][j-];
mn[i][j]=min(mn[i][j-],mn[pre[i][j-]][j-]);
}
scanf("%d",&q);
while(q--)
{
scanf("%d%d",&x,&y);
if(find(x)!=find(y))printf("-1\n");
else lca(x,y);
}
return ;
}

最新文章

  1. babel presets stage-x
  2. 本周PSP流程进度
  3. 我的第一个HTML的程序
  4. Python之路,day8-Python基础
  5. 红外遥控NEC协议使用总结
  6. c# 文件及目录操作类
  7. 第四十三章 微服务CICD(5)- gitlab + jenkins + docker + dockerregsitry
  8. adb permission denied
  9. 常用开源Jabber(XMPP) IM服务器介绍(转)
  10. js获取宽度设置thickbox百分比
  11. 深入浅出KNN算法(一) KNN算法原理
  12. [Oracle][DATAGUARD] 关于确认LOGICAL STANDBY的同期状况的方法
  13. 使用 shell 在多服务器上批量操作
  14. 基于 Consul 实现 MagicOnion(GRpc) 服务注册与发现
  15. CF1139B Chocolates
  16. 安装redis时Newer version of jemalloc required错误解决
  17. 排序算法&lt;No.5&gt;【堆排序】
  18. PHP快速入门
  19. webpack初入门
  20. static理解

热门文章

  1. Unity Shaders and Effects Cookbook (3-4) 使用高光贴图
  2. favico是针对网页图标内容更改
  3. log4j:WARN Please initialize the log4j system properly解决的方法
  4. Odoo 养猪
  5. JavaScript 工厂模式和订阅模式
  6. codeforces 570 D. Tree Requests 树状数组+dfs搜索序
  7. 笔记04 WPF对象引用
  8. idea常用的快捷命令
  9. 服务管理-DHCP、NTP、SSH
  10. linux的su和sudo(转载)