题意:给你一个树,有若干个询问,然后让你统计每个结点在询问中做了几次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 倍增法)相关推荐

  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. poj1470 LCA倍增法

    倍增法模板题 #include<iostream> #include<cstring> #include<cstdio> #include<queue> ...

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

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

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

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

  6. poj 3728 The merchant// lca(倍增实现) + dp || tarjan+并查集路径上dp

    poj 3728 The merchant// lca(倍增实现) + dp Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: ...

  7. LCA问题(倍增法)

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

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

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

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

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

最新文章

  1. 致谢 开源开发者的贡献_对开源做出的贡献如何使我成为更好的开发人员,以及如何做到这一点...
  2. Delphi下利用WinIo模拟鼠标键盘详解
  3. C语言中结构体的位域(bit-fields)
  4. 0330复利计算(修改版)
  5. 思科认证36个热门考点汇总
  6. 李宏毅机器学习(七)GPT的野望
  7. modifying的博客
  8. nagios流量监控报警
  9. Spring quartz插件的使用
  10. linux系统下UTF-8转GBK编码,使用汉字字库在LCD显示汉字
  11. PPT怎么切换不同的母版
  12. 移动应用推广的那些事儿:应用发现篇
  13. 学霸,顾名思义,就是成绩非常好
  14. 小米8无法开启位置服务器,小米8 WIFI 蓝牙打不开 GPS无法使用
  15. 《社交红利》读书总结--如何从微信微博QQ空间等社交网络带走海量用户、流量与收入...
  16. python学习——tsv文件批量转为csv文件、csv文件列合并
  17. 如何给一个 HTAP 数据库做基准测试?StoneDB学术分享会第4期
  18. matlab app设计步骤_1.1数学建模与MATLAB–MATLAB入门
  19. Robomongo 的安装
  20. 电子元器件、专业术语和芯片封装的基础知识

热门文章

  1. LtRecyclerView:自带上拉下拉,能增加头条目和尾条目的RecyclerView
  2. python调用centos防火墙_Centos7防火墙:Firewall基本使用命令,设置防火墙规则
  3. 【Java】练习题:三角形法则
  4. android viewpager动态加载页面,Android viewpager中动态添加view并实现伪无限循环的方法...
  5. excel多元线性拟合_Python一元线性回归分析实例:价格与需求的相关性
  6. picsart旧版本_PicsArt历史版下载
  7. 【c++】27.事件驱动、IO复用、sellect、poll、epoll三者的区别
  8. Spring - Java/J2EE Application Framework 应用框架 第 3 章 Beans, BeanFactory和ApplicationContext
  9. Java程序员从笨鸟到菜鸟之(六十七)细谈Spring(一)spring简介
  10. Storm入门之第一章