最小公共祖先 (Tarjan) POJ1470
POJ 1470
标准的LCA,输入感觉怪怪的=.=
自己看了下Tarjan,再参考了下别人的处理方法(感觉自己好弱。。)
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std; const int N = 1010;
const int M = 1000010; int in[N], par[N], ans[N];
bool vis[N];
int n, edge, m; struct ST
{
int top;
int next[M],key[M],head[N];
void add(int x,int y)
{
key[top] = y; //记录儿子
next[top] = head[x];
head[x] = top++;
}
void clear()
{
top = 0;
memset(head,-1,sizeof(head));
}
}son,q; int fin(int x)
{
if(x != par[x])
par[x] = fin(par[x]);
return par[x];
} void lca(int cur)
{
par[cur] = cur;
for(int i = son.head[cur];i != -1;i = son.next[i])
{
lca(son.key[i]);
par[son.key[i]] = cur;
}
vis[cur] = true;
for(int i = q.head[cur];i!= -1;i = q.next[i])
{
if(vis[q.key[i]])
ans[fin(q.key[i])]++;
}
} void ini()
{
memset(in,0,sizeof(in));
memset(vis,false,sizeof(vis));
memset(ans,0,sizeof(ans));
} int main()
{
int root, u, num, v;
while(scanf("%d", &n) != EOF)
{
ini();
son.clear(), q.clear();
for(int j = 0; j < n; ++j)
{
scanf("%d:(%d)", &u, &num);
for(int i = 0; i < num; ++i)
{
scanf("%d", &v);
son.add(u, v);
in[v]++;
}
}
for(root = 1;in[root];root++);
scanf("%d",&m);
while(m--)
{
scanf(" (%d %d)", &u, &v);
if(u == v)
q.add(v, u);
else
{
q.add(u, v);
q.add(v, u);
}
}
lca(root);
for(int i = 1;i <= n;i++)
if(ans[i])
printf("%d:%d\n", i, ans[i]);
}
return 0;
}
最小公共祖先 (Tarjan) POJ1470的更多相关文章
- 51.Lowest Common Ancestor of a Binary Tree(二叉树的最小公共祖先)
Level: Medium 题目描述: Given a binary tree, find the lowest common ancestor (LCA) of two given nodes ...
- [leetcode]236. Lowest Common Ancestor of a Binary Tree树的最小公共祖先
如果一个节点的左右子树上分别有两个节点,那么这棵树是祖先,但是不一定是最小的,但是从下边开始判断,找到后一直返回到上边就是最小的. 如果一个节点的左右子树上只有一个子树上遍历到了节点,那么那个子树可能 ...
- LCA 最近公共祖先 tarjan离线 总结 结合3个例题
在网上找了一些对tarjan算法解释较好的文章 并加入了自己的理解 LCA(Least Common Ancestor),顾名思义,是指在一棵树中,距离两个点最近的两者的公共节点.也就是说,在两个点通 ...
- HDU 4547 CD操作 (LCA最近公共祖先Tarjan模版)
CD操作 倍增法 https://i.cnblogs.com/EditPosts.aspx?postid=8605845 Time Limit : 10000/5000ms (Java/Other) ...
- LCA最近公共祖先——Tarjan模板
LCA(Lowest Common Ancestors),即最近公共祖先,是指在有根树中,找出某两个结点u和v最近的公共祖先. Tarjan是一种离线算法,时间复杂度O(n+Q),Q表示询问次数,其中 ...
- Network-POJ3694(最小公共祖先LCA+Tarjin)
http://poj.org/problem?id=3694 这一题 为什么要找最小祖先呢 当两个节点连到一块的时候 找最小公共节点就相当于找强连通分支 再找最小公共节点的过程中直到找到 这个过 ...
- LCA 最近公共祖先 Tarjan(离线)算法的基本思路及其算法实现
首先是最近公共祖先的概念(什么是最近公共祖先?): 在一棵没有环的树上,每个节点肯定有其父亲节点和祖先节点,而最近公共祖先,就是两个节点在这棵树上深度最大的公共的祖先节点. 换句话说,就是两个点在这棵 ...
- LCA最近公共祖先 Tarjan离线算法
学习博客: http://noalgo.info/476.html 讲的很清楚! 对于一颗树,dfs遍历时,先向下遍历,并且用并查集维护当前节点和父节点的集合.这样如果关于当前节点(A)的关联节点( ...
- PAT A1151 LCA in a Binary Tree (30 分)——二叉树,最小公共祖先(lca)
The lowest common ancestor (LCA) of two nodes U and V in a tree is the deepest node that has both U ...
随机推荐
- 201621123068 Week04-面向对象设计与继承
1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 答:继承.多态.重载.关键字.父类与子类 1.2 尝试使用思维导图将这些关键词组织起来. 2. 书面作业 1. 面向对象设计(大 ...
- java.lang.String 类源码解读
String类定义实现了java.io.Serializable, Comparable<String>, CharSequence 三个接口:并且为final修饰. public fin ...
- Mac使用brew安装软件
Homebrew官方网站:https://brew.sh/1,安装brew,Mac中打开Termal输入命令: /usr/bin/ruby -e "$(curl -fsSL https:// ...
- android 运行时异常捕获
1,将运行时异常捕获并存到手机SD卡上 可以直接使用logcat 命令Runtime.getRuntime().exec("logcat -f "+ file.getAbsolut ...
- URL编码和Base64编码 (转)
我们经常会遇到所谓的URL编码(也叫百分号编码)和Base64编码. 先说一下Bsae64编码.BASE64编码是一种常用的将二进制数据转换为64个可打印字符的编码,常用于在通常处理文本数据 ...
- LDAP的用户需求
使用LDAP(ApacheDS)构建统一认证服务(SSO单点登录) 构建团队协作的体系,需要涉及很多个系统,如SVN.Jenkins.Trac.Nexus等,而一般而言每个系统均有其用户体系,当我 ...
- spring-oauth-server实践:使用授权方式四:client_credentials 模式的客户端和服务端交互
spring-oauth-server入门(1-11)使用授权方式四:client_credentials 模式的客戶端 一.客户端逻辑 1.界面入口(credentials_access_token ...
- 2018年html5入门到精通教程电子书百度云盘下载共22本
名称 查看 <HTML5启动和运行>(HTML5.Up.and.Running)扫描版[PDF] 下载 <Pro HTML5 Performance>(Pro HTML5 Pe ...
- vue-router详解——小白速会
一.概述 vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用. vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来. ...
- C# webBrowser 控件赋值
string body = PostWebRequest(txtURL.Text, textBox2.Text); if (webBrowser1.ReadyState != WebBrowserRe ...