poj1330 LCA离线tarjan算法 复杂度O(n+q)

来源:互联网 发布:欧陆风云4 mac dlc 编辑:程序博客网 时间:2024/06/03 19:38

http://poj.org/problem?id=1330

题意:给出一个森林,求两节点的的lca

解题思路:

lca的离线tarjan算法,在dfs时不断将子节点并到父结点的集合中,在搜索另一棵树前,要重置f数组

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<iostream>#include<algorithm>#include<queue>#include<stack>#include<vector>#include<map>#include<set>#include<bitset>#include<utility.h>using namespace std;#define N 10005vector<int>tree[N];//图的邻接表vector<pair<int,int> >Q[N];//询问int ans[N];//保存每个询问的结果int indegree[N];//保存每个节点的入度int f[N];int find(int x)//找父根节点{if(f[x]!=x){f[x]=find(f[x]);}return f[x];}void mark(int a,int b){    f[find(b)] = find(a);}void LCA(int u) {    f[u]=u;for(int i=0; i<tree[u].size(); i++) //未visit子节点    {        LCA(tree[u][i]);        mark(u, tree[u][i]);//将子节点并到父结点的集合中    }for(int i=0; i<Q[u].size(); i++)//求当前节点与有关的节点的最近公共祖先{if(f[Q[u][i].first]!=-1)//如果另一个节点也已处理过{    ans[Q[u][i].second]=find(Q[u][i].first);}}}void callLCA(int n){    for(int i=1; i<=n; i++){if(indegree[i]==0)//寻找根节点,根节点的入度为0{    LCA(i);    memset(f,-1,sizeof(f));}}}void init(int n){    memset(f,-1,sizeof(f));    memset(indegree,0,sizeof(indegree));    memset(ans,-1,sizeof(ans));    for(int i=0;i<=n;i++)    {        tree[i].clear();        Q[i].clear();    }}int main(){int i,j,k;int t,n,m;scanf("%d",&t);while(t--){    scanf("%d",&n);    init(n);        int from,to;        m=n-1;//边数    for(i=1;i<=m;i++)    {        scanf("%d%d",&from,&to);//有from->to的一条边        tree[from].push_back(to);        indegree[to]++;    }    int q=1;//问题数    pair<int,int>p;    for(i=1;i<=q;i++)    {        scanf("%d%d",&from,&to);        p=make_pair(to,i);            Q[from].push_back(p);            p=make_pair(from,i);            Q[to].push_back(p);    }    callLCA(n);        for(i=1;i<=q;i++)        {            if(ans[i]==-1)            {printf("not connect");}            else            {printf("%d\n",ans[i]);}        }}}/*input:152 33 43 11 53 5output:3*/
参考资料:

http://dongxicheng.org/structure/lca-rmq/

http://blog.csdn.net/smallacmer/article/details/7432664

http://blog.csdn.net/cxllyg/article/details/7635992

0 0
原创粉丝点击