倍增法模板题

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
#define maxn 1000
#define DEG 20
struct Edge{int to,next;
}edge[maxn*maxn*2];
int head[maxn],tot;
void addedge(int u,int v){edge[tot].to=v;edge[tot].next=head[u];head[u]=tot++;
}
int fa[maxn][DEG];
int deg[maxn];
void bfs(int root){queue<int> que;deg[root]=0;fa[root][0]=root;que.push(root);while(!que.empty()){int tmp=que.front();que.pop();for(int i=1;i<DEG;i++)fa[tmp][i]=fa[fa[tmp][i-1]][i-1];for(int i=head[tmp];i!=-1;i=edge[i].next){int v=edge[i].to;if(v==fa[tmp][0]) continue;deg[v]=deg[tmp]+1;fa[v][0]=tmp;que.push(v);}}
}
int lca(int u,int v){if(deg[u]>deg[v]) swap(u,v);int hu=deg[u],hv=deg[v],tu=u,tv=v;for(int det=hv-hu,i=0;det;det>>=1,i++)if(det&1) tv=fa[tv][i];//将uv提到同一深度if(tu==tv) return tu;for(int i=DEG-1;i>=0;i--){if(fa[tu][i]==fa[tv][i]) continue;tu=fa[tu][i];tv=fa[tv][i];}return fa[tu][0];
}
int ans[maxn],flag[maxn];
void init(){tot=0;memset(ans,0,sizeof ans);memset(head,-1,sizeof head);memset(flag,0,sizeof flag);
}
int main(){int n,u,v,m,q;while(scanf("%d",&n)==1){init();for(int i=1;i<=n;i++){scanf("%d:(%d)",&u,&m);while(m--){scanf("%d",&v);addedge(u,v);addedge(v,u);flag[v]=true;}}int root;for(int i=1;i<=n;i++) if(!flag[i]){root=i;break;}bfs(root);scanf("%d",&q);char c;while(q--){cin>>c;scanf("%d %d)",&u,&v);ans[lca(u,v)]++;}for(int i=1;i<=n;i++)if(ans[i]) printf("%d:%d\n",i,ans[i]);}return 0;
}

转载于:https://www.cnblogs.com/zsben991126/p/10015204.html

poj1470 LCA倍增法相关推荐

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

    链接:http://poj.org/problem?id=1330 题意:q次询问求两个点u,v的LCA 思路:LCA模板题,首先找一下树的根,然后dfs预处理求LCA(u,v) AC代码: #inc ...

  2. LCA倍增法 求树的最近公共祖先(模板)

    LCA倍增法 求树的最近公共祖先 查询树上任意两个节点之间的路径信息,实际上就是找这两个节点的LCA,因为唯一路径就是这两个节点分别到LCA会合,所以关键问题就是求LCA,需要的路径信息可在找LCA过 ...

  3. poj 1470(简单LCA 倍增法)

    题意:给你一个树,有若干个询问,然后让你统计每个结点在询问中做了几次LCA.按照结点顺序输出. 思路:这也是简单的LCA题目,我用的是倍增法.每次查询在相应结点标记上++,最后输出即可.这道题的输入处 ...

  4. [算法总结] LCA倍增法 dfs

    目录 步骤 模板 题目 步骤 预处理 出 每个的2^j 的祖先 将两个点 移到同一位置 倍增从大到小的跳跃 模板 #include <iostream> #include <vect ...

  5. LCA(倍增+Tarjan)和BFS、DFS以及Prim、Kruskal

    文章目录 LCA 倍增 并查集 题目背景 题目描述 输入格式 输出格式 输入输出样例 Tarjan算法 LCA和倍增 LCA和Tarjan 深度优先搜索 广搜BFS 最小生成树 普里姆算法(找点) 克 ...

  6. (转)LCA模板(倍增法)

    插眼:点击查看 用法:求树上两个节点的公共祖先 代码: const int N=1e5+100;int n;//节点个数int k=log2(n)+1;int dp[N][20];//倍增法int d ...

  7. LCA问题(倍增法)

    之前写过了LCA的两个在线算法之一:DFS+ST方法(DFS+ST).本篇介绍另一种在线算法,用倍增思想来解决LCA问题.在学习倍增之前,先看一种倍增算法的退化版,有助于理解倍增法. 在找a和b的LC ...

  8. 树上倍增法求最近公共祖先LCA

    LCA,最近公共祖先,这个东西有很多作用,因此,如何高效求出LCA就成了一个热点的讨论话题. 下面所有的讨论都以图中这棵树为例子. 先来了解下什么是倍增吧,倍增其实就是二分的逆向,二分是逐渐缩小范围, ...

  9. 图论--LCA--树上倍增法(在线)

    /** LCA在线算法(倍增法) */ const int MAXN = 10010; const int DEG = 20;struct Edge {int to, next; } edge[MAX ...

最新文章

  1. SAP FICO hande汉得培训资料---II 应收模块篇 PDF 电子版
  2. 看完这篇文章保你面试稳操胜券——小程序篇
  3. Netflix Eureka
  4. 快讯:Oracle自治事务处理数据库发布和19c路线图
  5. Anaconda, conda, pyenv, virtualenv的区别
  6. 学习scrapy使用
  7. CVE-2010-2883Adobe Reader和Acrobat CoolType.dll栈缓冲区溢出漏洞分析
  8. SVN:下载、安装和中文设置
  9. QQ输入法 for iPhone2.3
  10. 深度森林实现时间序列预测(Python)
  11. AB余商c语言编程答案,C语言课后题编程答案
  12. Elasticsearch:IP 数据类型及其搜索
  13. ps 填充颜色快捷键
  14. 2019年高考数学解题技巧如何分配时间最合理
  15. UITextView内边距设置
  16. 玩转冷板式液冷 你需要一份靠谱的“设计参考”
  17. java 字符串中取消换行或添加换行
  18. 木头机器人变魔方_【转】一个木头魔方的制作过程
  19. CSS基础班笔记(二)
  20. spark-streaming统计各岗位招聘信息行数

热门文章

  1. mysql regexp边界_MySQL中REGEXP正则表达式使用大全
  2. 2018南华大学计算机学院,南华大学2019年排名第214位 较2018年下降32名
  3. mex 1 hello,world
  4. snapmix与Bi-Tempered Logistic Loss(自制数据集纯度不高效果好)
  5. Dropout与过拟合抑制
  6. python编辑器是什么_python开发用什么编辑器
  7. sql server 配置管理器里为什么是32位_Windows Server2012 配置打印服务器图文教程
  8. php 手册中show的使用,文档工具--showdoc(一)
  9. idea粘贴代码为什么都在一行_【学园】今天程序员的每一行代码都是未来高达身上的一颗螺丝...
  10. matlab数据归一化代码_深度学习amp;Matlab-LeNet实现图像分类