标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 24762 | Accepted: 12868 |
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
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector> using namespace std; #define N 10010 int n,t,cx,cy,deep[N]; vector<int>p[N<<1]; int g[N][21],vis[N]; void dfs(int x,int de){ for(int i=0;i<p[x].size();i++){ if(!deep[p[x][i]]){ deep[p[x][i]]=deep[x]+1; g[p[x][i]][0]=x; dfs(p[x][i],de+1); } } } int lca(int a,int b){ if(deep[a]<deep[b]) swap(a,b); int t=deep[a]-deep[b]; for(int i=0;i<=20;i++){ if((1<<i)&t){ a=g[a][i]; } } if(a==b) return a; for(int i=20;i>=0;i--){ if(g[a][i]!=g[b][i]){ a=g[a][i]; b=g[b][i]; } } return g[a][0]; } int main(){ scanf("%d",&t); while(t--){ memset(g,0,sizeof g); memset(p,0,sizeof p); memset(vis,0,sizeof vis); memset(deep,0,sizeof deep); scanf("%d",&n); for(int i=1,x,y;i<n;i++){ scanf("%d%d",&x,&y); p[x].push_back(y); vis[y]++; } scanf("%d%d",&cx,&cy); for(int i=1;i<=n;i++){ if(!vis[i]){//注意这是树,所以边是单向的,深搜的时候从根节点开始搜 dfs(i,1); break; } } for(int j=1;j<=20;j++){ for(int i=1;i<=n;i++){ g[i][j]=g[g[i][j-1]][j-1]; } } printf("%d\n",lca(cx,cy)); } return 0; }
标签:
原文地址:http://www.cnblogs.com/shenben/p/5656601.html