poj 1330(LCA)
2013-04-14 16:34
120 查看
基本题,留着模板
#include <iostream> #include <algorithm> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <string> #include <vector> #include <set> #include <queue> #include <stack> #include <climits>//形如INT_MAX一类的 using namespace std; vector<int>lz[10005],que[10005]; int vis[10005],nopa[10005]; int n,m,pa[10005],s,e; int find(int x) { if(pa[x] != x) return pa[x] = find(pa[x]); else return x; } void LCA(int u) { int i,j; for(i=0; i<lz[u].size(); i++) //递归处理 { LCA(lz[u][i]); pa[lz[u][i]] = u; } vis[u] = 1; for(i=0; i<que[u].size(); i++) //询问处理 { if(vis[que[u][i]]) { cout << find(que[u][i]) << endl; return; } } } int main() { int t,i,j,a,b; cin >> t; while(t--) { cin >> n; for(i=1; i<=n; i++) //初始化 { lz[i].clear(); que[i].clear(); vis[i] = 0; nopa[i] = 0; pa[i] = i; } for(i=1; i<n; i++) { scanf("%d%d",&a,&b); lz[a].push_back(b); //算是单向边,a是b的父结点 nopa[b] = 1; } scanf("%d%d",&s,&e); que[s].push_back(e); que[e].push_back(s); //询问两点连起关系 for(i=1; i<=n; i++) { if(!nopa[i]) //从总结点开始LCA { LCA(i); } } } return 0; }
相关文章推荐
- poj 1330 Nearest Common Ancestors(最近公共祖先(LCA))
- POJ-1330-只询问一次的LCA
- POJ 1330 Nearest Common Ancestors LCA
- poj 1330 (LCA模板题)
- POJ 1330 Nearest Common Ancestors(Tarjan离线LCA)
- poj 1330 Nearest Common Ancestors(LCA模板)
- poj-1330 Nearest Common Ancestors(LCA模板题)
- LCA Tarjan及倍增模板(POJ 1330)
- [POJ 1330][CodeVS 2370]LCA 倍增
- POJ 1330 Nearest Common Ancestors(LCA)
- POJ 1330 Nearest Common Ancestors (LCA)
- POJ 1330 Nearest Common Ancestors [LCA+RMQ]
- poj 1330 Nearest Common Ancestors(LCA:最近公共祖先)
- POJ 1330 Nearest Common Ancestors (LCA)
- poj 1330 Nearest Common Ancestors(LCA入门题)
- POJ 1330 Nearest Common Ancestors 【LCA·Tarjan离线算法】
- LCA POJ 1330 Nearest Common Ancestors
- POJ 1330 Nearest Common Ancestors【LCA】
- Nearest Common Ancestors poj 1330 LCA转RMQ
- poj1330,JDOJ3055部分分LCA(n^2暴力算法)