poj 1330 LCA 最近公共祖先
2015-02-03 15:07
387 查看
水题目。直接上代码了。
VIEW CODE
VIEW CODE
#include<cstdio> #include<algorithm> #include<iostream> #include<cmath> #include<queue> #include<stack> #include<string> #include<cstring> #include<map> #include<vector> #include<set> #include<ctime> #include<stdlib.h> using namespace std; const int mmax= 10010; const int mod=1000000007; typedef long long LL; struct node { int en; int next; }E[2*mmax]; int p[mmax],fa[mmax]; int num; int find(int x) { if(x==fa[x]) return x; return fa[x]=find(fa[x]); } void init() { memset(p,-1,sizeof p); num=0; } void add(int st,int en) { E[num].en=en; E[num].next=p[st]; p[st]=num++; } bool vis[mmax]; int x,y; void Lca(int u) { vis[u]=1; if( ( u==x|| u==y) &&vis[x] && vis[y]) printf("%d\n",find( u==x?y:x ) ); for(int i=p[u];i+1;i=E[i].next) { int v=E[i].en; if(!vis[v]) { Lca(v); fa[v]=u; } } } int main() { int t; cin>>t; while(t--) { int n; init(); scanf("%d",&n); for(int i=1;i<=n;i++) fa[i]=i; for(int i=1;i<n;i++) { int u,v; scanf("%d %d",&u,&v); add(u,v),add(v,u); fa[v]=u; } int root; for(int i=1;i<=n;i++) if(find(i)==i) root=i; scanf("%d %d",&x,&y); memset(vis,0,sizeof vis); for(int i=1;i<=n;i++) fa[i]=i; Lca(root); } return 0; }
相关文章推荐
- POJ 1330 Nearest Common Ancestors (最近公共祖先LCA + 详解博客)
- LCA 算法学习 (最近公共祖先)poj 1330
- 【POJ】1330 Nearest Common Ancestors ——最近公共祖先(LCA)
- POJ 1330 最近公共祖先LCA_Tarjan 【水】
- POJ 1330 最近公共祖先LCA(Tarjan离线做法)
- 【LCA倍增模板】【poj1330】最近公共祖先
- 【POJ1330】最近公共祖先(LCA):并查集+深搜
- POJ 1330 LCA最近公共祖先 离线tarjan算法
- poj 1330 Nearest Common Ancestors(最近公共祖先(LCA))
- 树的最近公共祖先——LCA poj1330 hdu2586
- LCA_最近公共祖先(离线)入门——POJ - 1330,HDU - 2586
- POJ1330 Nearest Common Ancestors(最近公共祖先LCA 并查集+DFS)
- [POJ 1330]Nearest Common Ancestors(LCA最近公共祖先)
- poj 1330 LCA最近公共祖先
- LCA 最近公共祖先 [POJ 1330]
- poj 1330 LCA最近公共祖先
- POJ - 1330 Nearest Common Ancestors(LCA最近公共祖先 朴素算法&倍增法)
- poj 1330 Nearest Common Ancestors(LCA:最近公共祖先)
- POJ 1330 最近公共祖先LCA_Tarjan 【水】
- POJ 1330 Nearest Common Ancestors / UVALive 2525 Nearest Common Ancestors (最近公共祖先LCA)