彩票网站做维护是什么,石家庄站在哪个区,贵州建设公司网站,个人网站需要几个备案题目链接#xff1a;https://www.luogu.org/problemnew/show/P3379 题意#xff1a;LCA模板题。 思路#xff1a;今天开始学树剖#xff0c;先拿lca练练。树剖解lca#xff0c;两次dfs复杂度均为O(n)#xff0c;每次查询为logn#xff0c;因此总复杂度为#xff1a;O(2…题目链接https://www.luogu.org/problemnew/show/P3379 题意LCA模板题。 思路今天开始学树剖先拿lca练练。树剖解lca两次dfs复杂度均为O(n)每次查询为logn因此总复杂度为O(2*nm*logn)。 代码 #includecstdio
#includecstring
using namespace std;const int maxn500005;struct node{int v,next;
}edge[2*maxn];int n,m,s,cnt,size[maxn],head[maxn],depth[maxn],son[maxn],fa[maxn],top[maxn];void add(int u,int v){edge[cnt].vv;edge[cnt].nexthead[u];head[u]cnt;
}void dfs1(int x){size[x]1;depth[x]depth[fa[x]]1;for(int ihead[x];i;iedge[i].next){int vedge[i].v;if(vfa[x]) continue;fa[v]x;dfs1(v);size[x]size[v];if(!son[x]||size[son[x]]size[v])son[x]v;}
}void dfs2(int x,int f){top[x]f;if(son[x]) dfs2(son[x],f);for(int ihead[x];i;iedge[i].next){int vedge[i].v;if(vfa[x]||vson[x]) continue;dfs2(v,v);}
}void lca(){for(int i0;im;i){int x,y;scanf(%d%d,x,y);while(top[x]!top[y]){if(depth[top[x]]depth[top[y]]) xfa[top[x]];else yfa[top[y]];}printf(%d\n,depth[x]depth[y]?x:y);}
}int main(){scanf(%d%d%d,n,m,s);for(int i1;in;i){int u,v;scanf(%d%d,u,v);add(u,v);add(v,u);}dfs1(s);dfs2(s,s);lca();return 0;
} 转载于:https://www.cnblogs.com/FrankChen831X/p/11167037.html