博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj1470
阅读量:7260 次
发布时间:2019-06-29

本文共 2234 字,大约阅读时间需要 7 分钟。

题意:基本的lca问题

分析:lca的离线算法为tarjan,tarjan算法的流程如下。dfs遍历树,节点a在遍历完成之后退回到a在树中的父亲节点,然后a在并查集中的father指针会指向这个父亲节点。也就是说一个节点,所有以它的被遍历过的直接子节点为根的子树中的点都会在并查集中被合并到这个点,并以它作为代表元。最开始每个点自己一个集合,每次合并操作都是伴随着遍历中的退后行为进行的。这样就产生了一个性质,在遍历过程中,一个被遍历过的节点的集合代表元在哪,取决于由树根到该节点的路径上我退后到了哪个节点。这样一来,所有遍历过的节点与当前节点的lca也恰好就是它们的代表元了。在遍历离开当前点之前,先将所有遍历过的点与当前点的lca在二维数组中记录下来。

#include 
#include
#include
#include
using namespace std;#define maxn 909int n, root;bool g[maxn][maxn], hasroot[maxn];int id[maxn], lcs[maxn][maxn];int sum[maxn];void input(){ int a, b, m; char st[100]; memset(g, 0, sizeof(g)); memset(hasroot, 0, sizeof(hasroot)); for (int i =0; i < n; i++) { scanf("%d", &a); a--; scanf("%[^0-9]", st); scanf("%d", &m); scanf("%[^0-9]", st); for (int i =0; i < m; i++) { scanf("%d", &b); b--; hasroot[b] =true; g[a][b] = g[b][a] =true; } } for (int i =0; i < n; i++) if (!hasroot[i]) { root = i; break; }}int get(int i){ if ((id[i] == i)) return i; return id[i] =get(id[i]);}void unin(int i, int j){ id[get(i)] =get(j);}void dfs(int rt){ int i; id[rt] = rt; for (i =0; i < n; ++i) if (g[rt][i] &&-1== id[i]) { dfs(i); unin(i, rt); } for (i =0; i < n; ++i) if (-1!= id[i]) lcs[rt][i] = lcs[i][rt] =get(i);}void work(){ int m; char st[100]; scanf("%d", &m); for (int i =0; i < m; i++) { int a, b; scanf("%[^0-9]", st); scanf("%d", &a); scanf("%[^0-9]", st); scanf("%d", &b); a--; b--; sum[lcs[a][b]]++; } for (int i =0; i < n; i++) if (sum[i]) printf("%d:%d\n", i +1, sum[i]);}int main(){ //freopen("t.txt", "r", stdin); char st[100]; while (scanf("%d", &n) != EOF) { input(); memset(id, -1, sizeof(id)); memset(sum, 0, sizeof(sum)); dfs(root); work(); scanf("%[^0-9]", st); } return 0;}
View Code

 

转载于:https://www.cnblogs.com/rainydays/archive/2011/06/20/2085503.html

你可能感兴趣的文章
牛客练习赛6
查看>>
私有地址范围
查看>>
CentOS 6.5自动化运维之基于cobbler服务的自动化安装操作系统详解
查看>>
jquery的on()函数
查看>>
一、深入分析spring--从DefaultListableBeanFactory开始
查看>>
jquery源码解析:val方法和valHooks对象详解
查看>>
grunt入门讲解7:项目脚手架grunt-init
查看>>
默默前行的livego--基于go语言的rtmp直播服务器
查看>>
HDU 4749 Parade Show(2013 ACM/ICPC Asia Regional Nanjing Online)
查看>>
tmux学习
查看>>
图片合成截屏
查看>>
Go 入门 - Go中的复杂类型
查看>>
answer my questions from the book<构建之法>.
查看>>
看不懂的C++:运算符重载
查看>>
C++ over-aligned memory allocation
查看>>
Discuz教程:关于安装使用时的一些小细节问题的总结
查看>>
面试时我不在乎候选人的经验来自培训班,但会关注商业项目经验和干活能力:再说面试时鉴别商业项目的方式...
查看>>
系统上下文图的作用
查看>>
Java_BigInteger
查看>>
Linux非阻塞IO(五)使用poll实现非阻塞的回射服务器客户端
查看>>