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

链接: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 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值