标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 24618 | Accepted: 12792 |
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
Source
[Submit] [Go Back] [Status] [Discuss]
————————————————————我是分割线————————————————————————————————
水题一道,LCA果题。
果断解决。
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<vector> 5 using namespace std; 6 const int N=10002; 7 const int Log=20; 8 int dp[N][Log],depth[N],deg[N]; 9 struct Edge 10 { 11 int to; 12 Edge *next; 13 }edge[2*N],*cur,*head[N]; 14 void addedge(int u,int v) 15 { 16 cur->to=v; 17 cur->next=head[u]; 18 head[u]=cur++; 19 } 20 void dfs(int u) 21 { 22 depth[u]=depth[dp[u][0]]+1; 23 for(int i=1;i<Log;i++) dp[u][i]=dp[dp[u][i-1]][i-1]; 24 for(Edge *it=head[u];it;it=it->next) 25 { 26 dfs(it->to); 27 } 28 } 29 int lca(int u,int v) 30 { 31 if(depth[u]<depth[v])swap(u,v); 32 for(int st=1<<(Log-1),i=Log-1;i>=0;i--,st>>=1) 33 { 34 if(st<=depth[u]-depth[v]) 35 { 36 u=dp[u][i]; 37 } 38 } 39 if(u==v) return u; 40 for(int i=Log-1;i>=0;i--) 41 { 42 if(dp[v][i]!=dp[u][i]) 43 { 44 v=dp[v][i]; 45 u=dp[u][i]; 46 } 47 } 48 return dp[u][0]; 49 } 50 void init(int n) 51 { 52 for(int i=0;i<=n;i++) 53 { 54 dp[i][0]=0; 55 head[i]=NULL; 56 deg[i]=0; 57 } 58 cur=edge; 59 } 60 int main() 61 { 62 int T; 63 scanf("%d",&T); 64 while(T--) 65 { 66 int n,u,v; 67 scanf("%d",&n); 68 init(n); 69 for(int i=0;i<n-1;i++) 70 { 71 scanf("%d%d",&u,&v); 72 addedge(u,v); 73 deg[v]++; 74 dp[v][0]=u; 75 } 76 for(int i=1;i<=n;i++) 77 { 78 if(deg[i]==0) 79 { 80 dfs(i); 81 break; 82 } 83 } 84 scanf("%d%d",&u,&v); 85 printf("%d\n",lca(u,v)); 86 } 87 return 0; 88 }
poj 1330 Nearest Common Ancestors 题解
标签:
原文地址:http://www.cnblogs.com/SBSOI/p/5642388.html