hdu2586[lca]

tarjon 是离线的算法,  在线的话会有倍增法和rmq,其实这2个方法有一曲同工之妙

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>using namespace std;
const int maxn=100000+123;#define forg(p,x) for(p=x; ~p; p=edge[p].next)struct Edge{int v, w, next;
}edge[maxn*2];
int head[maxn], cnt;
// for graph
void addedge(int u, int v, int w)
{edge[cnt].v=v;edge[cnt].w=w;edge[cnt].next=head[u];head[u]=cnt++;
}int fath[maxn], used[maxn];
// for dis-unionstruct query{int a, b, lca;
}list[maxn];
// forstruct Ans{int v, idx;
};
vector<Ans> ques[maxn];
// for every queryint find (int x)
{return fath[x]=(x==fath[x]? x: find(fath[x]));
}inline void merge (int x, int y)
{fath[find(y)]=find(x);
}int dis[maxn];
void dfs(int u, int r)
{for (int p=head[u]; ~p; p=edge[p].next){const int &v=edge[p].v;if(r==v)continue;dis[v]=dis[u]+edge[p].w;dfs(v, u);}
}void LCA(int u, int r)
{int p;fath[u]=u;//printf("u===%d\n", u);forg(p, head[u]){const int &v=edge[p].v;if(v==r)continue;LCA(v, u);merge(u, v);///u, v 顺序固定,必须将子合并到父,按秩合并不是和重要}//printf("%d  %d\n", anc[u], fath[u]);for(int i=0; i<ques[u].size(); ++i){const int &v=ques[u][i].v;if(~fath[v])list[ques[u][i].idx].lca=fath[find(v)];}
}bool isroot[maxn];
void init(int x)
{for (int i=0; i<x; ++i){ques[i].clear();fath[i]=i;}memset (head, -1, sizeof(head));cnt=0;
}int main ()
{char op[10];int n, m;int cas; scanf("%d", &cas);while (cas--){scanf("%d%d", &n, &m);init(n);for (int i=1; i<n; ++i){int a, b, c; scanf("%d %d %d", &a, &b, &c, op);a--; b--;addedge(a, b, c);addedge(b, a, c);}for (int i=0; i<m; ++i){int a, b; scanf("%d%d", &a, &b);a--; b--;list[i].a=a; list[i].b=b;Ans tmp; tmp.v=b; tmp.idx=i;ques[a].push_back(tmp);tmp.v=a;ques[b].push_back(tmp);}//puts("!");dfs(0, -1);LCA(0, -1);for (int i=0; i<m; ++i){printf("%d\n", dis[list[i].a]+dis[list[i].b]-2*dis[list[i].lca]);}}return 0;
}

zoj 2615 cells 非递归的tarjon.

yes no打错了。 wa了2次才看出来

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <stack>
#include <vector>
#define copy(a, b) memcpy(a, b, sizeof(a));
#define clean(a, x) memset (a, x, sizeof(a));
using namespace std;const int maxn=300000+123;
int anc[20000000+123];
#define vex edge[p].v
struct Edge{int v, next;}edge[2*maxn];
int head[maxn], cnt;
void addedge(int u, int v){//printf("%d %d\n", u, v);
edge[cnt].v=v; edge[cnt].next=head[u]; head[u]=cnt++;
}int fath[maxn], used[maxn];
struct Ans{int v, idx;
};vector< Ans > ques[maxn];int find (int x)
{  return fath[x]=(x==fath[x]? x: find(fath[x]));
}  inline void merge (int x, int y)
{  fath[find(y)]=find(x);
}  stack<int> S;
int cur[maxn], pre[maxn];
int res[1000000+123];
void LCA(int rt)
{S.push(0);fath[0]=0;pre[0]=-1;copy(cur, head);while (!S.empty()){bool flag=false;int u=S.top();///printf("%d\n", u);for (int p=cur[u]; ~p; p=edge[p].next){S.push(vex);fath[vex]=vex;pre[vex]=u;flag=true;cur[u]=edge[p].next;break;}if(flag)continue;///printf("%d is over\n", u);S.pop();for (int i=0; i<ques[u].size(); ++i){const Ans &a=ques[u][i];if(~fath[a.v])res[a.idx]=fath[find(a.v)];///printf("anc==%d %d\n", res[a.idx], a.idx);}if(~pre[u]){merge(pre[u], u);}}
}void init()
{clean(head, -1); cnt=0;
}
int qa[1000000+123];
int main()
{int cas; scanf("%d", &cas);for (int I=1; I<=cas; ++I){int n; scanf("%d", &n);int num=0;init();for (int i=0; i<n; ++i){ques[i].clear();fath[i]=i;int sc; scanf("%d", &sc);for (int j=0; j<sc; ++j){num++;
//              addedge(i, num);if(num<n)addedge(i, num);else anc[num-n]=i;}}//printf("num==%d\n", num);int m; scanf("%d", &m);for (int i=0; i<m; ++i){int a, b; scanf("%d%d", &a, &b);if(a!=b)qa[i]=a;else qa[i]=-1;if(a>=n)a=anc[a-n];if(b>=n)b=anc[b-n];Ans tmp; tmp.v=b; tmp.idx=i;ques[a].push_back(tmp);tmp.v=a;ques[b].push_back(tmp);}LCA(0);if(I!=1)printf("\n");printf("Case %d:\n", I);for (int i=0; i<m; ++i){///printf("%d %d ", qa[i], res[i]);if(qa[i]==res[i])puts("Yes");else puts("No");}}return 0;
}
/*
2
6
3 2 1 1 1 2
10
0 1
2 4
3 5
1 8
6 9
8 9
5 5
5 9
0 9
9 10
5
2 0 3 0 1
4
2 6
1 6
2 3
3 5*/

hdu2586[lca离线tarjon算法][递归与非递归]相关推荐

  1. 树与二叉树的深度优先与广度优先算法(递归与非递归)

    本博客前面文章已对树与二叉树有过简单的介绍,本文主要是重点介绍有关二叉树的一些具体操作与应用 阅读本文前,可以先参考本博客 各种基本算法实现小结(三)-- 树与二叉树   和  各种基本算法实现小结( ...

  2. 九十五、二叉树的递归和非递归的遍历算法模板

    @Author:Runsen 刷Leetcode,需要知道一定的算法模板,本次先总结下二叉树的递归和非递归的遍历算法模板. 二叉树的四种遍历方式,前中后加上层序遍历.对于二叉树的前中后层序遍历,每种遍 ...

  3. 二叉树创建及遍历算法(递归及非递归)(转)

    //二叉树处理头文件 //包括二叉树的结构定义,二叉树的创建,遍历算法(递归及非递归), /* 作者:成晓旭 时间:2001年10月7日(18:49:38-20:00:00) 内容:完成二叉树创建,二 ...

  4. 树的递归与非递归遍历算法

    树的递归与非递归遍历算法 树的递归与非递归遍历算法 树的遍历 实例 树遍历的口诀 树的递归遍历代码 树的先序遍历 树的中序遍历 树的后序遍历 递归遍历思想 树的非递归遍历 树的先序非递归遍历 先序遍历 ...

  5. 傅里叶变换算法c语言实现(递归与非递归)

    1.算法设计原理分析 把傅里叶变换公式进行拆分,按奇偶进行分组,使之转外为两个T(n/2)的计算式. 这样就可以找到了递归特性,可以一直拆分下去,直到一组只有一个数值.递归算法实现则可以为在每次递归中 ...

  6. (伪代码)树的前中后遍历和层次遍历算法实现(考研适用,递归和非递归)

    文章目录 前言 一.递归实现树的遍历 二.非递归实现 层次遍历 总结 前言 2022考研初试结束,总结了一些考研中基本常用算法.这篇主要是关于树的前中后遍历,递归实现和非递归实现两种,现在很多自命题在 ...

  7. 左神算法:分别用递归和非递归方式实现二叉树先序、中序和后序遍历(Java版)

    本题来自左神<程序员代码面试指南>"分别用递归和非递归方式实现二叉树先序.中序和后序遍历"题目. 题目 用递归和非递归方式,分别按照二叉树先序.中序和后序打印所有的节点 ...

  8. 算法之快速排序(递归和非递归)

    快速排序的两种实现方式.递归和非递归 1 package com.ebiz.sort; 2 3 import java.text.SimpleDateFormat; 4 import java.uti ...

  9. java 反转二叉树 非递归_【刷算法】翻转二叉树的递归和非递归解法

    题目描述 操作给定的二叉树,将其变翻转为源二叉树的镜像. 输入描述: 1 1 / \ / \ 2 3 ------> 3 2 / \ / \ / \ / \ 4 5 6 7 7 6 5 4 解题 ...

  10. 算法006:二分查找 递归、非递归

    题目: 已知一个有序数组arr 给定需要搜索的元素,返回索引,若无则返回-1思路: 递归和非递归 1.代码如下 BinSearch .java: package com.yuhl.right;/*** ...

最新文章

  1. 怎样使用Secure CRT查看vcenter和esxi主机的日志文件
  2. 高性能js之js文件的加载与解析
  3. Hystrix指标窗口实现原理
  4. CentOS6.5启动网络
  5. 百度社会化分享组件使用问题
  6. finditerable 转list_java – 通过拆分和运行将ListenableFuture转换为Iterable
  7. python函数主要通过接口与外界通信_PySpark源码解析,用Python调用高效Scala接口,搞定大规模数据分析...
  8. 算法手记 之 数据结构(并查集详解)(POJ1703)
  9. TreeNMS redis/memcached可视化客户端工具的使用
  10. java运行vbs_如何在Java中执行VBS脚本?
  11. 微星网卡linux驱动,微星b360系列win10无法安装网卡驱动解决方法_武汉久龙电脑维修中心...
  12. 手把手教你使用wordpress搭建个人网站
  13. air.tv.douyu.android,斗鱼(air.tv.douyu.android) - 7.0.6.1 - 应用 - 酷安
  14. 一文详解单目VINS论文与代码解读目录
  15. 循环中continue用法
  16. 香港服务器跟国内服务器的区别!
  17. Go 中 Gzip 与 json 搭配使用压缩数据,减少数据传输量
  18. 梅西的命运才是真正的人生
  19. Aspose.Imaging for .NET V23
  20. 学生励志创业者成为破烂王

热门文章

  1. HCIP——网络类型及数据链路层协议
  2. python 输入成绩能显示最高分_让孩子学AI和python,把你的微信跳一跳刷到最高分...
  3. zynq板子烧写Flash时提示unrecognized JEDEC id bytes
  4. 无广告 齐全 简洁 免费的音乐开源软件(支持 电脑max win linux 手机 )——lxMusic
  5. golang 避免程序出现死循环
  6. 瑞云渲染史诗巨作《巴霍巴利王:开端》横扫印度票房
  7. web移动端 定位 总结
  8. 李者璈 - PyChina 首届社区之星 - 2020
  9. 获取select下面选中的value值和文本值。--http://blog.163.com/yiba_suanzao/blog/static/130557377201038113543135/
  10. 拆迁补偿费:契税计税基础究竟如何确定?