LCA【模板】
1 #include <algorithm> 2 #include <cstdio> 3 #include <vector> 4 5 #define N 10015 6 7 using namespace std; 8 9 vector<int>vec[N]; 10 int n,a,b,m,deep[N],dad[N][100]; 11 12 int LCA(int x,int y) 13 { 14 if(deep[x]>deep[y]) swap(x,y); 15 for(int i=20;i>=0;i--) 16 if(deep[dad[y][i]]>=deep[x]) y=dad[y][i]; 17 if(x==y) return x; 18 for(int i=20;i>=0;i--) 19 if(dad[x][i]!=dad[y][i]) 20 x=dad[x][i],y=dad[y][i]; 21 return dad[x][0]; 22 } 23 24 void DFS(int x) 25 { 26 deep[x]=deep[dad[x][0]]+1; 27 for(int i=0;dad[x][i];i++) 28 dad[x][i+1]=dad[dad[x][i]][i]; 29 for(int i=0;i<vec[x].size();i++) 30 if(!deep[vec[x][i]]) dad[vec[x][i]][0]=x,DFS(vec[x][i]); 31 } 32 33 int main() 34 { 35 scanf("%d",&n); 36 for(int i=1;i<n;i++) 37 { 38 scanf("%d%d",&a,&b); 39 vec[a].push_back(b); 40 vec[b].push_back(a); 41 } 42 DFS(1); 43 scanf("%d",&m); 44 while(m--) 45 { 46 scanf("%d%d",&a,&b); 47 printf("%d\n",LCA(a,b)); 48 } 49 return 0; 50 } 51 /* 52 6 53 1 2 54 1 3 55 4 2 56 5 2 57 3 6 58 5 59 4 5 60 2 6 61 3 6 62 1 5 63 4 6 64 */
1 #include <algorithm> 2 #include <cstdio> 3 #include <vector> 4 5 using namespace std; 6 7 const int N(10005); 8 vector<int>vec[N]; 9 int n,q,x,y; 10 int size[N],deep[N],top[N],dad[N]; 11 12 void DFS(int x) 13 { 14 size[x]=1; deep[x]=deep[dad[x]]+1; 15 for(int i=0;i<vec[x].size();i++) 16 if(vec[x][i]!=dad[x]) 17 { 18 dad[vec[x][i]]=x; 19 DFS(vec[x][i]); 20 size[x]+=size[vec[x][i]]; 21 } 22 } 23 24 void DFS_(int x) 25 { 26 int t=0; if(!top[x]) top[x]=x; 27 for(int i=0;i<vec[x].size();i++) 28 if(vec[x][i]!=dad[x]&&size[t]<size[vec[x][i]]) t=vec[x][i]; 29 if(t) top[t]=top[x], DFS_(t); 30 for(int i=0;i<vec[x].size();i++) 31 if(vec[x][i]!=dad[x]&&t!=vec[x][i]) DFS_(vec[x][i]); 32 } 33 34 int LCA(int x,int y) 35 { 36 while(top[x]!=top[y]) 37 { 38 if(deep[top[x]]<deep[top[y]]) swap(x,y); 39 x=dad[top[x]]; 40 } 41 if(deep[x]>deep[y]) swap(x,y); 42 return x; 43 } 44 45 int main() 46 { 47 scanf("%d",&n); 48 for(int i=1;i<n;i++) 49 { 50 scanf("%d%d",&x,&y); 51 vec[x].push_back(y); 52 vec[y].push_back(x); 53 } 54 DFS(1); DFS_(1); 55 scanf("%d",&q); 56 for(;q;q--) 57 { 58 scanf("%d%d",&x,&y); 59 printf("%d\n",LCA(x,y)); 60 } 61 return 0; 62 }
——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。