poj1470 LCA倍增法
倍增法模板题
#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倍增法相关推荐
- 01分数规划c语言,POJ 1330(LCA/倍增法模板)
链接:http://poj.org/problem?id=1330 题意:q次询问求两个点u,v的LCA 思路:LCA模板题,首先找一下树的根,然后dfs预处理求LCA(u,v) AC代码: #inc ...
- LCA倍增法 求树的最近公共祖先(模板)
LCA倍增法 求树的最近公共祖先 查询树上任意两个节点之间的路径信息,实际上就是找这两个节点的LCA,因为唯一路径就是这两个节点分别到LCA会合,所以关键问题就是求LCA,需要的路径信息可在找LCA过 ...
- poj 1470(简单LCA 倍增法)
题意:给你一个树,有若干个询问,然后让你统计每个结点在询问中做了几次LCA.按照结点顺序输出. 思路:这也是简单的LCA题目,我用的是倍增法.每次查询在相应结点标记上++,最后输出即可.这道题的输入处 ...
- [算法总结] LCA倍增法 dfs
目录 步骤 模板 题目 步骤 预处理 出 每个的2^j 的祖先 将两个点 移到同一位置 倍增从大到小的跳跃 模板 #include <iostream> #include <vect ...
- LCA(倍增+Tarjan)和BFS、DFS以及Prim、Kruskal
文章目录 LCA 倍增 并查集 题目背景 题目描述 输入格式 输出格式 输入输出样例 Tarjan算法 LCA和倍增 LCA和Tarjan 深度优先搜索 广搜BFS 最小生成树 普里姆算法(找点) 克 ...
- (转)LCA模板(倍增法)
插眼:点击查看 用法:求树上两个节点的公共祖先 代码: const int N=1e5+100;int n;//节点个数int k=log2(n)+1;int dp[N][20];//倍增法int d ...
- LCA问题(倍增法)
之前写过了LCA的两个在线算法之一:DFS+ST方法(DFS+ST).本篇介绍另一种在线算法,用倍增思想来解决LCA问题.在学习倍增之前,先看一种倍增算法的退化版,有助于理解倍增法. 在找a和b的LC ...
- 树上倍增法求最近公共祖先LCA
LCA,最近公共祖先,这个东西有很多作用,因此,如何高效求出LCA就成了一个热点的讨论话题. 下面所有的讨论都以图中这棵树为例子. 先来了解下什么是倍增吧,倍增其实就是二分的逆向,二分是逐渐缩小范围, ...
- 图论--LCA--树上倍增法(在线)
/** LCA在线算法(倍增法) */ const int MAXN = 10010; const int DEG = 20;struct Edge {int to, next; } edge[MAX ...
最新文章
- SAP FICO hande汉得培训资料---II 应收模块篇 PDF 电子版
- 看完这篇文章保你面试稳操胜券——小程序篇
- Netflix Eureka
- 快讯:Oracle自治事务处理数据库发布和19c路线图
- Anaconda, conda, pyenv, virtualenv的区别
- 学习scrapy使用
- CVE-2010-2883Adobe Reader和Acrobat CoolType.dll栈缓冲区溢出漏洞分析
- SVN:下载、安装和中文设置
- QQ输入法 for iPhone2.3
- 深度森林实现时间序列预测(Python)
- AB余商c语言编程答案,C语言课后题编程答案
- Elasticsearch:IP 数据类型及其搜索
- ps 填充颜色快捷键
- 2019年高考数学解题技巧如何分配时间最合理
- UITextView内边距设置
- 玩转冷板式液冷 你需要一份靠谱的“设计参考”
- java 字符串中取消换行或添加换行
- 木头机器人变魔方_【转】一个木头魔方的制作过程
- CSS基础班笔记(二)
- spark-streaming统计各岗位招聘信息行数
热门文章
- mysql regexp边界_MySQL中REGEXP正则表达式使用大全
- 2018南华大学计算机学院,南华大学2019年排名第214位 较2018年下降32名
- mex 1 hello,world
- snapmix与Bi-Tempered Logistic Loss(自制数据集纯度不高效果好)
- Dropout与过拟合抑制
- python编辑器是什么_python开发用什么编辑器
- sql server 配置管理器里为什么是32位_Windows Server2012 配置打印服务器图文教程
- php 手册中show的使用,文档工具--showdoc(一)
- idea粘贴代码为什么都在一行_【学园】今天程序员的每一行代码都是未来高达身上的一颗螺丝...
- matlab数据归一化代码_深度学习amp;Matlab-LeNet实现图像分类