标签:int LCA bool P3379 500000 模板
P3379 【模板】最近公共祖先(LCA)
LCA模板
询问离线 tarjan算法
#include<bits/stdc++.h> using namespace std; vector<int> v[500000+5]; int N,M,root; bool vis[500000+5]; struct Q { int x,y; int id; bool operator< (Q a) { if(a.x==x)return y<a.y; return x<a.x; } }; bool cmp(Q a,Q b) { if(a.x==b.x)return a.y<b.y; return a.x<b.x; } vector<Q>q; int fa[500000+5]; void init() { for(int i=1; i<=N; i++) { fa[i]=i; } } int find(int x) { return fa[x]=(x==fa[x]?x:find(fa[x])); } void merge(int x,int y) { int a=find(x); int b=find(y); fa[b]=a; } int ans[500000+5]; void tarjan(int r,int Fa) { //cout<<r<<'\n'; for(int i=0; i<v[r].size(); i++) { if(v[r][i]!=Fa) { tarjan(v[r][i],r); merge(r,v[r][i]); vis[v[r][i]]=1; } //fa[find(v[r][i])]=r; } Q t; t.x=r; t.y=t.id=0; int i=lower_bound(q.begin(),q.end(),t)-q.begin(); //cout<<r<<'r'<<endl; //cout<<i<<'i'<<'\n'; for(i; i<q.size(); i++) { //if(ans[i]==0) if(ans[q[i].id]==0) if((q[i].x==r&&vis[q[i].y])) { // cout<<q[i].id<<"www"<<endl; ans[q[i].id]=find(q[i].y); } if(q[i].x!=r)break; } } int main() { scanf("%d%d%d",&N,&M,&root); init(); int a,b; for(int i=0; i<N-1; i++) { scanf("%d%d",&a,&b); v[a].push_back(b); v[b].push_back(a); } for(int i=0; i<M; i++) { Q x,y; scanf("%d%d",&x.x,&x.y); x.id=i; y.x=x.y; y.y=x.x; y.id=i; q.push_back(x); q.push_back(y); } sort(q.begin(),q.end(),cmp); tarjan(root,-1); for(int i=0; i<M; i++) { cout<<ans[i]<<'\n'; } /*for(int i=1;i<=N;i++){ cout<<fa[i]<<' '; }*/ }
标签:int,LCA,bool,P3379,500000,模板 来源: https://www.cnblogs.com/liulex/p/11436619.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。