博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
求LCA最近公共祖先的离线Tarjan算法_C++
阅读量:4086 次
发布时间:2019-05-25

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

 

  这个Tarjan算法是求LCA的算法,不是那个强连通图的

  它是 离线 算法,时间复杂度是 O(m+n),m 是询问数,n 是节点数

  它的优点是比在线算法好写很多

  不过有些题目是强制在线的,此类离线算法就无法使用了

  另附上在线ST算法的链接:

    


 

  直接上伪代码:

  源代码中将询问用栈分节点一个个压入,而且克隆了单次询问,如询问 1 5 节点,则将 5 压入 1 的栈中,并且将 5 压入 1 的栈中

  因为当询问时会有一次另一个还未加入并查集的情况

 

#include<algorithm>

#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<stack>
#define N 100001
using namespace std;

int down[N],next[N],f[N],ans[N],n;

stack<int> s[N],num[N];
int find(int x)
{
  return f[x]==x?x:f[x]=find(f[x]);
}
void dfs(int x)
{
    f[x]=x;
    int i;
    for (i=down[x];i!=0;i=next[i])
        {
            dfs(i);
            f[find(f[i])]=find(f[x]);
        }
    while (!s[x].empty())
      {
        if (f[s[x].top()]!=s[x].top()) ans[num[x].top()]=find(f[s[x].top()]);
        s[x].pop();
        num[x].pop();
      }
}
int main()
{
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);
    int i,x,y,t,root;
    scanf("%d",&n);
    for (i=1;i<=n;i++)
        {
            scanf("%d",&x);
            next[i]=down[x];
            down[x]=i;
            if (x==0) root=i;
        }
    scanf("%d",&t);
    for (i=1;i<=t;i++)
        {
            scanf("%d%d",&x,&y);
            if (x==y) ans[i]=x;
            s[x].push(y);
            s[y].push(x);
            num[x].push(i);
            num[y].push(i);
        }
    dfs(root);
    for (i=1;i<=t;i++) printf("%d\n",ans[i]);
    return 0;
}

 

 

转载地址:http://bwuii.baihongyu.com/

你可能感兴趣的文章
自定义大头针
查看>>
UIButton添加block点击事件
查看>>
利用runtime给类别添加属性
查看>>
本地推送
查看>>
FMDB的使用
查看>>
UIImage存为本地文件与UIImage转换为NSData
查看>>
[转]打印质数的各种算法
查看>>
[转]javascript with延伸的作用域是只读的吗?
查看>>
php的autoload与global
查看>>
IE不支持option的display:none属性
查看>>
[分享]mysql内置用于字符串型ip地址和整数型ip地址转换函数
查看>>
TableDnd(JQuery表格拖拽控件)应用进阶
查看>>
[转]开源中最好的Web开发的资源
查看>>
Https加密及攻防
查看>>
Java生成随机不重复推广码邀请码
查看>>
【JAVA数据结构】双向链表
查看>>
【JAVA数据结构】先进先出队列
查看>>
String类的intern方法随笔
查看>>
【泛型】一个简易的对象间转换的工具类(DO转VO)
查看>>
1.随机函数,计算机运行的基石
查看>>