tarjan算法求LCA
//tarjan算法 #include<bits/stdc++.h> using namespace std; const int maxn=5e5+10; vector<int> tre[maxn]; struct node{ int to; int id; }; vector<node> query[maxn]; int ans[maxn],vis[maxn],fa[maxn]; int n,m,s; int find(int x) { if (fa[x]==x) return x; else return fa[x]=find(fa[x]); } void tarjan(int r) { fa[r]=r; vis[r]=1; for (int i=0;i<tre[r].size();i++) { int v=tre[r][i]; if (!vis[v]) { tarjan(v); fa[v]=r; } } for (int i=0;i<query[r].size();i++) { node q=query[r][i]; if (vis[q.to]) { ans[q.id]=find(q.to); } } } int main() { cin>>n>>m>>s; for (int i=1;i<n;i++) { int x,y; cin>>x>>y; tre[x].push_back(y); tre[y].push_back(x); } for (int i=1;i<=m;i++) { int x,y; node qn; cin>>x>>y; qn.to=x; qn.id=i; query[y].push_back(qn); qn.to=y; query[x].push_back(qn); } for (int i=1;i<=n;i++) fa[i]=i; tarjan(s); for (int i=1;i<=m;i++) { cout<<ans[i]<<endl; } }
标签:tarjan,int,LCA,back,fa,maxn,P3379,qn From: https://www.cnblogs.com/smghj/p/16870885.html