P3379 模板最近公共祖先(LCA)
Posted hahaha2124652975
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P3379 模板最近公共祖先(LCA)相关的知识,希望对你有一定的参考价值。
我昨天晚上一个题目都没有做。。所以只有以前的tarjan代码了。。
1 #include<set> 2 #include<map> 3 #include<list> 4 #include<queue> 5 #include<stack> 6 #include<string> 7 #include<cmath> 8 #include<ctime> 9 #include<vector> 10 #include<bitset> 11 #include<memory> 12 #include<utility> 13 #include<cstdio> 14 #include<sstream> 15 #include<iostream> 16 #include<cstdlib> 17 #include<cstring> 18 #include<algorithm> 19 using namespace std; 20 21 int n,m,s,e,q,a,b; 22 int fir[500050],to[1000100],ne[1001000]; 23 int firp[500500],as[1000050],nep[1001000],ans[1000100]; 24 bool vis[500050]; 25 int fa[500050]; 26 int f[500010]; 27 28 void add1(int u,int v) 29 e++; 30 to[e]=v; 31 ne[e]=fir[u]; 32 fir[u]=e; 33 34 35 void add2(int x,int y) 36 q++; 37 as[q]=y; 38 nep[q]=firp[x]; 39 firp[x]=q; 40 41 42 int findr(int x) 43 if(x!=fa[x]) 44 fa[x]=findr(fa[x]); 45 46 return fa[x]; 47 48 49 void un(int x,int y) 50 int xx=findr(x); 51 int yy=findr(y); 52 if(xx!=yy) 53 fa[xx]=yy; 54 55 56 57 void tarjan(int x) 58 for(int i=fir[x];i;i=ne[i]) 59 int t=to[i]; 60 if(t==f[x]) 61 continue; 62 63 f[t]=x; 64 tarjan(t); 65 un(t,x); 66 vis[t]=1; 67 68 for(int i=firp[x];i;i=nep[i]) 69 int y=as[i]; 70 if(vis[y]) 71 ans[i]=findr(y); 72 73 74 75 76 int main() 77 scanf("%d%d%d",&n,&m,&s); 78 for(int i=1;i<=n-1;i++) 79 scanf("%d%d",&a,&b); 80 add1(a,b); 81 add1(b,a); 82 83 for(int i=1;i<=m;i++) 84 scanf("%d%d",&a,&b); 85 add2(a,b); 86 add2(b,a); 87 88 for(int i=1;i<=n;i++) 89 fa[i]=i; 90 f[i]=i; 91 92 tarjan(s); 93 for(int i=1;i<=m;i++) 94 printf("%d\n",max(ans[2*i],ans[2*i-1])); 95 96 return 0; 97
以上是关于P3379 模板最近公共祖先(LCA)的主要内容,如果未能解决你的问题,请参考以下文章