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
- poj1330 LCA离线tarjan算法 复杂度O(n+q)
- hdu 2586 LCA离线算法 Tarjan+并查集 O(n+q)
- POJ1330(LCA-离线tarjan)
- poj1330 LCA在线算法 复杂度O(nlogn)
- poj1330 LCA离线算法
- poj1330+hdu2586 LCA离线算法
- hihocoder 1067 最近公共祖先·二(tarjan LCA 离线算法O(n))
- LCA 离线算法 tarjan
- LCA 离线tarjan算法
- LCA Tarjan离线算法
- LCA离线算法tarjan
- LCA离线算法Tarjan
- LCA 离线算法: tarjan
- LCA问题的Tarjan算法(POJ1330)
- lca离线算法模板(poj1330验证)
- POJ1330:Nearest Common Ancestors(LCA + Tarjan离线处理)
- POJ1330 Nearest Common Ancestors (tarjan离线求LCA模板)
- LCA三种算法学习(离线算法tarjan+在线算法转rmq+在线倍增)例题poj1330、1470;hdu4547、2874
- EXT4.0 (1~3章)学习资料
- 线段树——poj1823
- python tornado window 平台安装
- C++下string用法总结
- MongoDB权限管理之用户名和密码的操作
- poj1330 LCA离线tarjan算法 复杂度O(n+q)
- EXT4.0 (4~9章)学习资料
- ExtJs4学习笔记一--基础知识
- 组播性能
- table tr 多选
- C# 知识点收集
- ExtJS4学习笔记二--表单控件相关
- ASP.NET Chart 实例 及 解决ChartImg.axd 执行子请求时出错
- javaweb中关于读取资源文件三种方式