链接:http://poj.org/problem?id=1330

题意:q次询问求两个点u,v的LCA

思路:LCA模板题,首先找一下树的根,然后dfs预处理求LCA(u,v)

AC代码:

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

typedef long long ll;

const int maxbit = ;

const int maxn = 1e4+;

vector G[maxn];

int depth[maxn];

int fa[maxn][maxbit];

int Log[maxn];

int N;

void pre(){

Log[] = -;

Log[] = ,Log[] = ;

for(int i = ;i

}

void dfs(int cur,int father){//dfs预处理

depth[cur] = depth[father] + ;//当前结点的深度为父亲结点+1

fa[cur][] = father;//更新当前结点的父亲结点

for(int j = ;(<

fa[cur][j] = fa[fa[cur][j-]][j-];

}

for(int i = ;i

if(G[cur][i] != father) {//dfs遍历

dfs(G[cur][i],cur);

}

}

}

int LCA(int u,int v){

if(depth[u]

int dist = depth[u] - depth[v];//深度差

while(depth[u]!=depth[v]){//把较深的结点u倍增到与v高度相等

u = fa[u][Log[depth[u]-depth[v]]];

}

if(u == v) return u;//如果u倍增到v,说明v是u的LCA

for(int i = Log[depth[u]];i>=;i--){//否则两者同时向上倍增

if(fa[u][i]!=fa[v][i]){//如果向上倍增的祖先不同,说明是可以继续倍增

u = fa[u][i];//替换两个结点

v = fa[v][i];

}

}

return fa[u][];//最终结果为u v向上一层就是LCA

}

int main()

{

int t;

pre();

scanf("%d",&t);

while(t--){

scanf("%d",&N);

int root ;

int in[maxn];

for(int i = ;i

G[i].clear() ;

}

memset(in,,sizeof(in));

int u,v;

for(int i = ;i

scanf("%d%d",&u,&v);

in[v] = ;

G[u].push_back(v);

G[v].push_back(u);

}

for(int i = ;i<=N;i++){//寻树的根结点

if(in[i] == ) {

root = i;

break;

}

}

dfs(root,);

scanf("%d%d",&u,&v);

int ans = LCA(u,v);

printf("%d\n",ans);

}

return ;

}

poj 1330 LCA &lpar;倍增&plus;离线Tarjan&rpar;

/* 先来个倍增 */ #include #include #include #define maxn 100 ...

POJ - 1330 Nearest Common Ancestors(dfs&plus;ST在线算法&vert;LCA倍增法)

1.输入树中的节点数N,输入树中的N-1条边.最后输入2个点,输出它们的最近公共祖先. 2.裸的最近公共祖先. 3. dfs+ST在线算法: /* LCA(POJ 1330) 在线算法 DFS+ST ...

LCA(最近公共祖先)——LCA倍增法

一.前人种树 博客:最近公共祖先 LCA 倍增法 博客:浅谈倍增法求LCA 二.沙场练兵 题目:POJ 1330 Nearest Common Ancestors 代码: const int MAXN ...

poj1470 LCA倍增法

倍增法模板题 #include #include #include #include ...

luogu3379 【模板】最近公共祖先&lpar;LCA&rpar; 倍增法

题目大意:给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 整体步骤:1.使两个点深度相同:2.使两个点相同. 这两个步骤都可用倍增法进行优化.定义每个节点的Elder[i]为该节点的2^k( ...

poj 1330 LCA最近公共祖先

今天学LCA,先照一个模板学习代码,给一个离线算法,主要方法是并查集加上递归思想. 再搞,第一个离线算法是比较常用了,基本离线都用这种方法了,复杂度O(n+q).通过递归思想和并查集来寻找最近公共祖先 ...

hdu2586 lca倍增法

倍增法加了边的权值,bfs的时候顺便把每个点深度求出来即可 #include #include #include

最近公共祖先 LCA 倍增法

[简介] 解决LCA问题的倍增法是一种基于倍增思想的在线算法. [原理] 原理和同样是使用倍增思想的RMQ-ST 算法类似,比较简单,想清楚后很容易实现. 对于每个节点u , ancestors[u] ...

POJ 1330 LCA裸题~

POJ 1330 Description A rooted tree is a well-known data structure in computer science and engineerin ...

随机推荐

Python基本语法&lbrack;二&rsqb;,python入门到精通&lbrack;四&rsqb;

在上一篇博客Python基本语法,python入门到精通[二]已经为大家简单介绍了一下python的基本语法,上一篇博客的基本语法只是一个预览版的,目的是让大家对python的基本语法有个大概的了解. ...

常见web错误码 404 500

404表示文件或资源未找到java WEB常见的错误代码1.1xx-信息提示:这些状态代码表示临时的响应.客户端在收到常规响应之前,应准备接收一个或多个1xx响应.100-继续.101-切换协议.2. ...

nuget&period;exe the application could not be started

http://stackoverflow.com/questions/5730412/error-when-running-the-nuget-exe-command Ok, so this turn ...

PDO应用

MySQL中的事务

MySQL中的事务性: MySQL的InnoDB引擎是支持事务性的,事务是由多条SQL语句组成,是一个连续的一组数据库操作.只有该组内的每一个操作都成功时,整个事务才执行成功.(例如银行转账操作,只有 ...

php 编程效率(2)

1.尽量静态化: 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍. 当然了,这个测试方法需要在十万级以上次执行,效果才明显. 其实静态方法和非静态方法的 ...

Linux 入门笔记

一开始对linux总有些抵触,黑黑的命令框不知道如何下手,这次因为工作交接的缘故需要负责之前同事的Node后端部分,node,redis这些都是部署在Linux上的,看了几次运维的同学噼里啪啦的敲命令 ...

bibli直播弹幕实时爬取

1 分析数据来源  在不知道弹幕信息在哪里的时候,只能去all里面查看每一个相应的信息,看信息是否含有弹幕信息 在知道弹幕信息文件的时候,我们可以直接用全局文件搜索,定位到弹幕数据文件.操作如下图 2 ...

SElinux测试及排错

一.修改SElinux的状态 #sestatus --查看状态 #setenforce --临时修改 #setenforce #getenforce #vim /etc/selinux/config ...

01分数规划c语言,POJ 1330(LCA/倍增法模板)相关推荐

  1. poj 1330 LCA (倍增+离线Tarjan)

    /* 先来个倍增 */ #include<iostream> #include<cstring> #include<cstdio> #define maxn 100 ...

  2. poj 3621 Sightseeing Cows 01分数规划

    题目大意: http://poj.org/problem?id=3621 题解: 首先我们容易发现最优的路线一定只经过一个环. 所以我们可以把点权合并到边权上. 然后就转化为了一个01分数规划问题 求 ...

  3. poj 2976 Dropping tests 01分数规划

    题目大意: http://poj.org/problem?id=2976 题解: 裸的01分数规划 #include <cstdio> #include <cstring> # ...

  4. POJ 2728 01分数规划

    题意: 最优比率生成树,要求生成树中的所有边的花费与所有边的长度的比值最小 题解: 01分数规划,详见http://www.cnblogs.com/proverbs/archive/2013/01/0 ...

  5. POJ 2976 01分数规划基础题目

    题意:       给你一组"数",一共n个,每个数有两个权值,价钱a[i],代价b[i],让你选择n - k使得 sigma(a[i]) / sigma(b[i]) * 100 ...

  6. 二分+01分数规划+最大化平均值 Dropping tests POJ - 2976

    题意: 给你若n个分数,分子a[i]a[i]a[i],分母b[i]b[i]b[i],使满足公式100⋅∑i=1nai∑i=1nbi100\cdot\tfrac{\sum_{i=1}^{n} a_{i} ...

  7. poj 2976 基础01分数规划

    这个题算是01分数规划的最基本的应用了, 01分数规划是给你n对数(a1, b1)....(an, bn), 然后让你选择一些数对, 使得sigma(ai)/sigma(bi)最大.这里附上讲解一份, ...

  8. Bailian4145 放弃考试 POJ2976 ZOJ3068 Dropping tests【二分法+01分数规划】

    4145:放弃考试 总时间限制: 1000ms 内存限制: 65536kB 描述 在一门课程中,一共有n场考试.假如你在i场考试中可以答对bi道题中的ai道,那么你的累计平均分定义为:100·Σai/ ...

  9. POJ-3621 Sightseeing Cows 最优比率环、01分数规划

    题目链接:http://poj.org/problem?id=3621 这题是01分数规划问题,详细资料点这里.有了01分数规划的基础后,这个题目就很简单了.构建函数f(mid)=Σ(w[i]-mid ...

最新文章

  1. 如何才能使用内存小或者显存小的设备训练神经网络
  2. vivado环境下实现比较器
  3. td 属性 noWrap 防止折行、撑开(及其它文字换行问题)
  4. java8 stream流操作集合交集,差集,并集,过滤,分组,去重,排序,聚合等
  5. Python: PS滤镜--径向模糊
  6. 微信小程序——风水罗盘
  7. 第四十讲 ASP.NET消息处理(一)
  8. linux 中select()函数的使用
  9. c语言函数调用--素数
  10. c语言编程软件平板_ipad可以编程c语言吗
  11. Shell脚步乱码问题解决方案
  12. 【Python学习教程】Python变量类型和运算符
  13. Matlab画混淆矩阵(多分类)
  14. Java面向对象案例——购物车
  15. 介绍一款好用的flash播放器(Vcastr 3.0 – flash video(flv) player)
  16. window系统下nodejs安装及环境配置
  17. Linux系统 安装飞桨PaddleHub+LAC实现词法分析 实现加载自定义词典分词 (解决Lac服务启动报错问题、解决自定义词典空格无法分词问题)
  18. Linux九阴真经之九阴白骨爪残卷9(存储引擎MyISAM、MySQL服务器变量)
  19. 【论文笔记】Tube Convolutional Neural Network (T-CNN) for Action Detection in Videos
  20. Xcode5.1如何关闭ARC

热门文章

  1. 65位高校教师接龙晒工资,给打算入高校的博士们参考!
  2. AI美少女小冰单飞,自由成长成现实?
  3. 【视频编码学习】AVS3参考软件HPM-4.1简单配置运行
  4. 什么是Instagram卷轴,它是TikTok克隆吗?
  5. JS 使用搜狐接口获取客户端IP地址
  6. firework算法_NIPS 2018人工智能假肢挑战赛结束,百度Firework团队夺得第一
  7. Cobbler Web界面操作(五)
  8. JVM内存模型 和 Java内存模型 对比学习
  9. python判断成语_Python20行代码用正则表达式查询成语含特定汉字者
  10. 工具系列——windows10安装教程