【模板·LCA】洛谷3379 最近公共祖先(LCA)
阿新 • • 發佈:2019-02-05
思路:tarjan。
程式碼:
#include <cstdio> #include <iostream> #include <algorithm> #include <stack> #include <queue> #include <deque> #include <set> #include <cstring> #include <map> using namespace std; #define maxn 500000 int n,m,rt; vector<int> a[maxn+5]; struct V{ int y,id; V(){} V(const int yy,const int idd){ y=yy,id=idd; } }; vector<V> q[maxn+5]; int fa[maxn+5]={0}; int find(int x){ return fa[x]?fa[x]=find(fa[x]):x; } int lca[maxn+5]={0}; void tarjan(int x,int t){ for(int i=0;i<a[x].size();i++){ int u=a[x][i]; if(u==t) continue; tarjan(u,x); fa[u]=x; } for(int i=0;i<q[x].size();i++){ V y=q[x][i]; int f=find(y.y); if(f!=y.y){ lca[y.id]=f; } } } int main() { scanf("%d%d%d",&n,&m,&rt); for(int i=1;i<n;i++){ int x,y; scanf("%d%d",&x,&y); a[x].push_back(y); a[y].push_back(x); } for(int i=1;i<=m;i++){ int x,y; scanf("%d%d",&x,&y); q[x].push_back(V(y,i)); q[y].push_back(V(x,i)); } tarjan(rt,-1); for(int i=1;i<=m;i++){ printf("%d\n",lca[i]); } return 0; }