poj 1470(简单LCA 倍增法)
题意:给你一个树,有若干个询问,然后让你统计每个结点在询问中做了几次LCA。按照结点顺序输出。
思路:这也是简单的LCA题目,我用的是倍增法。每次查询在相应结点标记上++,最后输出即可。这道题的输入处理比较烦,而且第一个输入的结点并不是根节点。这要注意一下
代码如下:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cmath> 5 #include <cstring> 6 #include <algorithm> 7 #include <queue> 8 #include <stack> 9 #include <vector> 10 #include <set> 11 #include <map> 12 #define MP(a, b) make_pair(a, b) 13 #define PB(a) push_back(a) 14 15 using namespace std; 16 17 typedef long long ll; 18 typedef pair<int ,int> pii; 19 typedef pair<unsigned int, unsigned int> puu; 20 typedef pair<int ,double> pid; 21 typedef pair<ll, int> pli; 22 23 const int INF = 0x3f3f3f3f; 24 const double eps = 1e-6; 25 const int LEN = 1000+10; 26 const int LOG_LEN = 100; 27 vector<int> Map[LEN]; 28 int root, parent[LOG_LEN][LEN], depth[LEN], ind[LEN]; 29 30 void dfs(int v, int p, int d){ 31 parent[0][v] = p; 32 depth[v] = d; 33 for(int i=0; i<Map[v].size(); i++){ 34 if(Map[v][i] != p) dfs(Map[v][i], v, d+1); 35 } 36 } 37 38 void init(int n){ 39 dfs(root, -1, 0); 40 for(int k=0; k+1<LOG_LEN; k++){ 41 for(int v=1; v<=n; v++){ 42 if(parent[k][v] < 0) parent[k+1][v] = -1; 43 else parent[k+1][v] = parent[k][parent[k][v]]; 44 } 45 } 46 } 47 48 int lca(int u, int v){ 49 if(depth[u] > depth[v])swap(u,v); 50 for(int k=0; k < LOG_LEN; k++){ 51 if((depth[u] - depth[v]) >> k & 1) v = parent[k][v]; 52 } 53 if(u==v) return u; 54 for(int k=LOG_LEN-1; k>=0; k--){ 55 if(parent[k][v] != parent[k][u]){ 56 u = parent[k][u]; 57 v = parent[k][v]; 58 } 59 } 60 return parent[0][u]; 61 } 62 63 int main() 64 { 65 // freopen("in.txt", "r", stdin); 66 67 int n, a, b, tn, q; 68 while(scanf("%d", &n)!=EOF){ 69 for(int i=0; i<LEN; i++)Map[i].clear(); 70 memset(ind, 0, sizeof ind); 71 for(int i=1; i<=n; i++){ 72 scanf("%d:(%d)", &a, &tn); 73 for(int j=0; j<tn; j++){ 74 scanf("%d", &b); 75 Map[a].PB(b); 76 Map[b].PB(a); 77 ind[b]++; 78 } 79 } 80 for(int i=1; i<=n; i++)if(!ind[i]){root = i;break;} 81 memset(ind, 0, sizeof ind); 82 init(n); 83 scanf("%d", &q); 84 for(int i=0; i<q; i++){ 85 while(getchar() != '('); 86 scanf("%d%d", &a, &b); 87 while(getchar() != ')'); 88 ind[lca(a, b)] ++; 89 } 90 for(int i=1; i<=n; i++){ 91 if(!ind[i])continue; 92 printf("%d:%d\n", i, ind[i]); 93 } 94 } 95 return 0; 96 }
View Code
转载于:https://www.cnblogs.com/shu-xiaohao/p/3529693.html
poj 1470(简单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过 ...
- poj1470 LCA倍增法
倍增法模板题 #include<iostream> #include<cstring> #include<cstdio> #include<queue> ...
- [算法总结] LCA倍增法 dfs
目录 步骤 模板 题目 步骤 预处理 出 每个的2^j 的祖先 将两个点 移到同一位置 倍增从大到小的跳跃 模板 #include <iostream> #include <vect ...
- LCA(倍增+Tarjan)和BFS、DFS以及Prim、Kruskal
文章目录 LCA 倍增 并查集 题目背景 题目描述 输入格式 输出格式 输入输出样例 Tarjan算法 LCA和倍增 LCA和Tarjan 深度优先搜索 广搜BFS 最小生成树 普里姆算法(找点) 克 ...
- poj 3728 The merchant// lca(倍增实现) + dp || tarjan+并查集路径上dp
poj 3728 The merchant// lca(倍增实现) + dp Time Limit: 3000MS Memory Limit: 65536K Total Submissions: ...
- LCA问题(倍增法)
之前写过了LCA的两个在线算法之一:DFS+ST方法(DFS+ST).本篇介绍另一种在线算法,用倍增思想来解决LCA问题.在学习倍增之前,先看一种倍增算法的退化版,有助于理解倍增法. 在找a和b的LC ...
- 树上倍增法求最近公共祖先LCA
LCA,最近公共祖先,这个东西有很多作用,因此,如何高效求出LCA就成了一个热点的讨论话题. 下面所有的讨论都以图中这棵树为例子. 先来了解下什么是倍增吧,倍增其实就是二分的逆向,二分是逐渐缩小范围, ...
- (转)LCA模板(倍增法)
插眼:点击查看 用法:求树上两个节点的公共祖先 代码: const int N=1e5+100;int n;//节点个数int k=log2(n)+1;int dp[N][20];//倍增法int d ...
最新文章
- 致谢 开源开发者的贡献_对开源做出的贡献如何使我成为更好的开发人员,以及如何做到这一点...
- Delphi下利用WinIo模拟鼠标键盘详解
- C语言中结构体的位域(bit-fields)
- 0330复利计算(修改版)
- 思科认证36个热门考点汇总
- 李宏毅机器学习(七)GPT的野望
- modifying的博客
- nagios流量监控报警
- Spring quartz插件的使用
- linux系统下UTF-8转GBK编码,使用汉字字库在LCD显示汉字
- PPT怎么切换不同的母版
- 移动应用推广的那些事儿:应用发现篇
- 学霸,顾名思义,就是成绩非常好
- 小米8无法开启位置服务器,小米8 WIFI 蓝牙打不开 GPS无法使用
- 《社交红利》读书总结--如何从微信微博QQ空间等社交网络带走海量用户、流量与收入...
- python学习——tsv文件批量转为csv文件、csv文件列合并
- 如何给一个 HTAP 数据库做基准测试?StoneDB学术分享会第4期
- matlab app设计步骤_1.1数学建模与MATLAB–MATLAB入门
- Robomongo 的安装
- 电子元器件、专业术语和芯片封装的基础知识
热门文章
- LtRecyclerView:自带上拉下拉,能增加头条目和尾条目的RecyclerView
- python调用centos防火墙_Centos7防火墙:Firewall基本使用命令,设置防火墙规则
- 【Java】练习题:三角形法则
- android viewpager动态加载页面,Android viewpager中动态添加view并实现伪无限循环的方法...
- excel多元线性拟合_Python一元线性回归分析实例:价格与需求的相关性
- picsart旧版本_PicsArt历史版下载
- 【c++】27.事件驱动、IO复用、sellect、poll、epoll三者的区别
- Spring - Java/J2EE Application Framework 应用框架 第 3 章 Beans, BeanFactory和ApplicationContext
- Java程序员从笨鸟到菜鸟之(六十七)细谈Spring(一)spring简介
- Storm入门之第一章