poj----1330Nearest Common Ancestors(简单LCA)
时间:2022-05-05
本文章向大家介绍poj----1330Nearest Common Ancestors(简单LCA),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目连接 http://poj.org/problem?id=1330
就是构建一棵树,然后问你两个节点之间最近的公共父节点是谁?
代码:
1 /*Source Code
2 Problem: 1330 User: huifeidmeng
3 Memory: 1232K Time: 63MS
4 Language: C++ Result: Accepted
5
6 Source Code
7 */
8 #include<iostream>
9 #include<vector>
10 #include<cstdio>
11 #include<cstring>
12 #include<cstdlib>
13 using namespace std;
14 const int maxn=10002;
15 vector<int> tree[maxn],qus[maxn];
16 int rank[maxn],father[maxn];
17 bool vis[maxn];
18 int rudu[maxn];
19 int lroot[maxn];
20 void init(int n){
21 memset(vis,0,sizeof(vis));
22 memset(rudu,0,sizeof(rudu));
23 memset(lroot,0,sizeof(lroot));
24 for(int i=1;i<=n;i++){
25 father[i]=i;
26 rank[i]=1;
27 tree[i].clear();
28 qus[i].clear();
29 }
30 }
31 int find(int a){
32 while(a!=father[a])
33 a=father[a];
34 return a;
35 }
36 void Union(int a,int b)
37 {
38 int x=find(a);
39 int y=find(b);
40 if(x==y) return ;
41 if(rank[x]<rank[y]){
42 rank[y]+=rank[x];
43 father[x]=y;
44 }
45 else {
46 rank[x]+=rank[y];
47 father[y]=x;
48 }
49 }
50 void LCA(int u)
51 {
52 lroot[u]=u;
53 int len=tree[u].size();
54 for(int i=0;i<len;i++){
55 LCA(tree[u][i]);
56 Union(u,tree[u][i]);
57 lroot[find(u)]=u;
58 }
59 vis[u]=1;
60 int ss=qus[u].size();
61 for(int i=0;i<ss;i++){
62 if(vis[qus[u][i]]){
63 printf("%dn",lroot[find(qus[u][i])]);
64 return ;
65 }
66 }
67 }
68 int main()
69 {
70 int cas,n,u1,u2;
71 //freopen("test.in","r",stdin);
72 scanf("%d",&cas);
73 while(cas--){
74 scanf("%d",&n);
75 init(n);
76 for(int i=1;i<n;i++){
77 scanf("%d%d",&u1,&u2);
78 tree[u1].push_back(u2);
79 rudu[u2]++;
80 }
81 scanf("%d%d",&u1,&u2);
82 qus[u1].push_back(u2);
83 qus[u2].push_back(u1);
84 for(int i=1;i<=n;i++){
85 if(0==rudu[i]){ //找到root
86 LCA(i);
87 break;
88 }
89 }
90 }
91 return 0;
92 }
- [基础]datagridview绑定数据源的几种常见方式
- c#:winform鼠标拖动窗口大小时,设定窗口最小尺寸
- 在非SqlServer数据库上实现MemberShip和Role功能(自定义MemberShipProvider和RoleProvider)
- 一种实用的表格行鼠标点击高亮效果
- Lucene:QueryParser中操作符的疑惑
- 利用Boost影响Lucene查询结果的排序
- 利用Boost影响Lucene查询结果的排序
- linq to sql取出随机记录/多表查询/将查询出的结果生成xml
- [原创]Func〈T, TResult〉 泛型委托 以及演变历程(整理自MSDN)
- 上市企业4位数秒下的域名 如今9.9万元出售
- 黑客横行,全球安全系统集成市场将破百亿美元
- 有好东西融资2000万美金:官网启用四拼域名
- 全球首个农业全产业链智能工程“农业大脑”入选ECI
- 大数据说消费正从炫耀转向体验
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 简单的 CAS 实现 SSO 单点登录
- 为什么 Java 中“1000==1000”为false,而”100==100“为true?
- 详解股票买卖算法的最优解(一)
- 详解股票买卖算法的最优解(二)
- Bertopology: Bert及其改进型总结
- Go 如何实现热重启
- Serverless ETL —— 蘑菇街实战落地
- Day35:数组中的逆序对
- Day36:两个链表的第一个公共结点
- 第5天: 文本处理流程——拼写纠错
- Spring 自定义类型转换器
- Spring BeanPostProcessor 的执行顺序
- Day37:数字在排序数组中出现的次数
- Spring 动态代理
- 如何理解面向切面编程中的切面?