标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 19919 | Accepted: 10544 |
Description
Input
Output
Sample Input
2 16 1 14 8 5 10 16 5 9 4 6 8 4 4 10 1 13 6 15 10 11 6 7 10 2 16 3 8 1 16 12 16 7 5 2 3 3 4 3 1 1 5 3 5
Sample Output
4 3
单次的lca,每次从u和v的depth较深的开始往上面找,然后如果一样就跳出,不一样继续找
复杂度depth[u]+depth[v]
#include <cstdio> #include <cmath> #include <cstring> #include <ctime> #include <iostream> #include <algorithm> #include <set> #include <vector> #include <sstream> #include <queue> #include <typeinfo> #include <fstream> #include <map> typedef long long ll; using namespace std; //freopen("D.in","r",stdin); //freopen("D.out","w",stdout); #define sspeed ios_base::sync_with_stdio(0);cin.tie(0) #define maxn 10019 #define eps 1e-9 const int inf=0x7fffffff; //无限大 int flag1[maxn]; int flag2[maxn]; vector<int> G[maxn];//图的邻接表表示方法 int root;//根节点的编号 int parent[maxn];//父亲节点 int depth[maxn];//节点的深度 void dfs(int v,int p,int d) { parent[v]=p; depth[v]=d; for(int i=0;i<G[v].size();i++) { if(G[v][i]!=p) dfs(G[v][i],v,d+1); } } void init() { dfs(root,0,-1); } int lca(int u,int v) { while(depth[u]>depth[v]) u=parent[u]; while(depth[v]>depth[u]) v=parent[v]; while(u!=v) { u=parent[u]; v=parent[v]; } return u; } int main() { int t; cin>>t; while(t--) { int n; cin>>n; for(int i=0;i<n;i++) G[i].clear(); memset(parent,0,sizeof(parent)); memset(depth,0,sizeof(depth)); memset(flag1,0,sizeof(flag1)); memset(flag2,0,sizeof(flag2)); int a,b; for(int i=0;i<n-1;i++) { cin>>a>>b; G[a].push_back(b); flag1[a]=1; flag2[b]=1; } for(int i=1;i<=n;i++) { if(flag1[i]==1&&flag2[i]==0) { root=i; break; } } init(); cin>>a>>b; cout<<lca(a,b)<<endl; } }
poj 1330 Nearest Common Ancestors 单次LCA/DFS
标签:
原文地址:http://www.cnblogs.com/qscqesze/p/4293596.html