#include <cstdio>
#include <iostream>
#include <ctime>
#include <vector>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long LL;
const int N=1e4+;
const int INF=0x3f3f3f3f;
struct Edge{
int u,v,w,next;
bool operator<(const Edge &rhs)const{
return w>rhs.w;
}
}o[N*],edge[N<<];
int fa[N][],fat[N],head[N],tot,p[N][];
void add(int u,int v,int w){
edge[tot].w=w;
edge[tot].v=v;
edge[tot].next=head[u];
head[u]=tot++;
}
int find(int x){
if(x==fat[x])return x;
return fat[x]=find(fat[x]);
}
int d[N];
void dfs(int u,int f){
d[u]=d[f]+;
fa[u][]=f;
for(int i=head[u];~i;i=edge[i].next){
int v=edge[i].v;
if(v==f)continue;
dfs(v,u);
p[v][]=edge[i].w;
}
}
int lca(int u,int v){
int ans=INF;
if(d[u]<d[v])swap(u,v);
for(int t=d[u]-d[v],i=;t;t>>=,++i)
if(t&)ans=min(p[u][i],ans),u=fa[u][i];
if(u==v)return ans;
for(int i=;i>=;--i){
if(fa[u][i]!=-&&fa[u][i]!=fa[v][i]){
ans=min(ans,p[u][i]);
ans=min(ans,p[v][i]);
u=fa[u][i],v=fa[v][i];
}
}
ans=min(ans,p[u][]);
ans=min(ans,p[v][]);
return ans;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=m;++i){
scanf("%d%d%d",&o[i].u,&o[i].v,&o[i].w);
}
sort(o+,o++m);
for(int i=;i<=n;++i)fat[i]=i,head[i]=-;
int cnt=;
for(int i=;i<=m;++i){
int x=find(o[i].u),y=find(o[i].v);
if(x!=y){
fat[y]=x;
++cnt;
add(o[i].u,o[i].v,o[i].w);
add(o[i].v,o[i].u,o[i].w);
if(cnt>=n-)break;
}
}
memset(p,INF,sizeof(p));
memset(fa,-,sizeof(fa));
for(int i=;i<=n;++i){
if(fat[i]==i){
dfs(i,);
fa[i][]=-;
}
}
for(int j=;(<<j)<=n;++j){
for(int i=;i<=n;++i){
if(fa[i][j-]!=-)
{
fa[i][j]=fa[fa[i][j-]][j-];
p[i][j]=min(p[i][j-],p[fa[i][j-]][j-]);
}
}
}
int q;
scanf("%d",&q);
while(q--){
int u,v;
scanf("%d%d",&u,&v);
if(find(u)!=find(v)){
printf("-1\n");
continue;
}
printf("%d\n",lca(u,v));
}
return ;
}

分析:

看这个就好http://hzwer.com/1344.html 仰慕黄学长

然后刚开始我没想写倍增,想写树剖的,后来一看,树剖勉强应该多一个log,而且代码长

所以倍增大法好

最新文章

  1. 两种方式实现java生成Excel
  2. PowerDesigner成功生成PDM进行check model后的错误提示解决途径
  3. thinkphp 配置多数据库
  4. 个推+DCLOUD,推送消息和透传消息
  5. Linq to Xml示例
  6. iftop 使用
  7. JAXB - XML Schema Types, Date and Time
  8. json中文编码问题
  9. MVC笔记
  10. 高质量程序设计指南C/C++语言——C++/C常量(2)
  11. sugarcrm关于邮件设置几个不好理解的地方
  12. ibus用上搜狗拼音词库
  13. Swift2.0 函数学习笔记
  14. Linux无法连接上127.0.0.1,拒绝连接,更新时提示无法下载,无法正常使用apt-get update
  15. 03 整合IDEA+Maven+SSM框架的高并发的商品秒杀项目之web层
  16. jacascript JSON对象的学习
  17. python的exec
  18. Docker端口映射与容器互联
  19. 阿里云服务器上通过Docker部署redmine
  20. WebRTC学习之 Intel&#174; Collaboration Suite for WebRTC源码流程解读

热门文章

  1. linux shell编程学习笔记(一)---通配符,元字符
  2. Linux 终端中常用的快捷键
  3. QML鼠标事件实现变色矩形
  4. cookie、localStorage、sessionStorage之间的区别
  5. 图片裁切插件jCrop的使用心得(三)
  6. mysql 数据库备份,恢复。。。。
  7. 如何做到 jQuery-free?
  8. Java 中正确使用 hashCode 和 equals 方法
  9. cocos2d lua的cclog 在logcat中显示
  10. 使用WiX Toolset创建.NET程序发布Bootstrapper(安装策略管理)(一)-----初识WiX (转)