当前位置: 首页 > news >正文

P3379 【模板】最近公共祖先(LCA)(st表,tarjan两种版本)

题目描述

如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。

输入格式

第一行包含三个正整数 N,M,SN,M,SN,M,S,分别表示树的结点个数、询问的个数和树根结点的序号。

接下来 N−1N-1N1 行每行包含两个正整数 x,yx, yx,y,表示 xxx 结点和 yyy 结点之间有一条直接连接的边(数据保证可以构成树)。

接下来 MMM 行每行包含两个正整数 a,ba, ba,b,表示询问 aaa 结点和 bbb 结点的最近公共祖先。

输出格式

输出包含 MMM 行,每行包含一个正整数,依次为每一个询问的结果。

输入输出样例 #1

输入 #1

5 5 4
3 1
2 4
5 1
1 4
2 4
3 2
3 5
1 2
4 5

输出 #1

4
4
1
4
4

说明/提示

对于 30%30\%30% 的数据,N≤10N\leq 10N10M≤10M\leq 10M10

对于 70%70\%70% 的数据,N≤10000N\leq 10000N10000M≤10000M\leq 10000M10000

对于 100%100\%100% 的数据,1≤N,M≤5×1051 \leq N,M\leq 5\times10^51N,M5×1051≤x,y,a,b≤N1 \leq x, y,a ,b \leq N1x,y,a,bN不保证 a≠ba \neq ba=b

样例说明:

该树结构如下:

第一次询问:2,42, 42,4 的最近公共祖先,故为 444

第二次询问:3,23, 23,2 的最近公共祖先,故为 444

第三次询问:3,53, 53,5 的最近公共祖先,故为 111

第四次询问:1,21, 21,2 的最近公共祖先,故为 444

第五次询问:4,54, 54,5 的最近公共祖先,故为 444

故输出依次为 4,4,1,4,44, 4, 1, 4, 44,4,1,4,4

2021/10/4 数据更新 @fstqwq:应要求加了两组数据卡掉了暴力跳。

题解

递归版
#include <bits/stdc++.h>
using namespace std;
const int N=6e5+10;
typedef long long ll;
int n,m,s;
vector<int>e[N];
int st[N][20];
int pw;
int deep[N];
bool vis[N];
void dfs(int u,int f)
{deep[u]=deep[f]+1;st[u][0]=f;vis[u]=true;// cout<<u<<' '<<f<<endl;for(int p=1;p<=pw;p++){st[u][p]=st[st[u][p-1]][p-1];}for(auto v:e[u]){if(vis[v])continue;dfs(v,u);}
}int lca(int a,int b)
{if(deep[a]<deep[b]){swap(a,b);}for(int p=pw;p>=0;p--){if(deep[st[a][p]]>=deep[b])a=st[a][p];}if(a==b)return a;for(int p=pw;p>=0;p--){if(st[a][p]!=st[b][p]){a = st[a][p];b = st[b][p];}}// cout<<st[a][0]<<endl;return st[a][0];
}void solve()
{cin>>n>>m>>s;for(int i=1;i<=n-1;i++){int u,v;cin>>u>>v;e[u].push_back(v);e[v].push_back(u);}int a,b;pw = log2(n);dfs(s,0);for(int i=1;i<=m;i++){cin>>a>>b;cout<<lca(a,b)<<endl;}
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t=1;// cin>>t;while(t--){solve();}return 0;
}
tarjan算法模板

#include <bits/stdc++.h>
using namespace std;
const int N=6e5+10;
typedef long long ll;
int n,m,s;
vector<int>e[N];
vector<pair<int,int>>q[N];
int fa[N];
int ans[N];
bool vis[N];
int find(int i)
{return fa[i]==i?i:fa[i]=find(fa[i]);
}void tarjan(int u,int f)
{vis[u]=true;fa[u]=u;for(auto v:e[u]){if(v==f)continue;tarjan(v,u);fa[v]=u;}for(auto nd:q[u]){int v = nd.first;int id = nd.second;if(vis[v]){ans[id]=find(v);}}
}void solve()
{cin>>n>>m>>s;for(int i=1;i<=n-1;i++){int u,v;cin>>u>>v;e[u].push_back(v);e[v].push_back(u);}for(int i=1;i<=m;i++){int u,v;cin>>u>>v;q[u].push_back({v,i});q[v].push_back({u,i});}for(int i=1;i<=n;i++)fa[i]=i;tarjan(s,0);for(int i=1;i<=m;i++)cout<<ans[i]<<endl;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t=1;// cin>>t;while(t--){solve();}return 0;
}
http://www.dtcms.com/a/555035.html

相关文章:

  • 找设计方案的网站互联网营销平台
  • 佛山网站优化公司排名wordpress 伪静态 403
  • POI搜索:图文教程!多种条件搜索POI数据,支持地图可视化,支持导出SHP、GEOJSON、DXF等文件格式
  • IoControlCode=20IOCTL_ICA_STACK_CONNECTION_SEND分析
  • 网站品牌高端定制设计网站公司价格
  • 青岛茶叶网站建设网站备案前置审批类型
  • 大兴做网站的公司宁波公司网页制作
  • 网站做收录全网整合营销推广方案
  • 每日两题day29
  • 百度云建站WordPresswordpress下载管理
  • API 管理平台的核心功能有哪些?企业该如何选型?
  • 快站app官网下载wordpress自动加标签
  • 崂山区建设局网站最新时事热点
  • 视频直播网站开发 设计合肥做网站的公司百度
  • 广州做网站网络公司外贸网站建设流程图
  • 网站收录下降的原因买完域名网站怎么设计
  • vscode插件开发-创建AI聊天面板
  • 广州行业门户网站建设怎样做网站运营
  • 东莞做网站公司电话wordpress多说加载慢
  • wordpress网站破解仿京东网站后台
  • 做网站建设的基本步骤趣闻网站如何做
  • 网站制作属于什么行业我国的跨境电商平台有哪些
  • 提高网站规范化建设帮忙做ppt赚钱的网站
  • JAVA1031 NUM求和
  • 2021年免费的网站有哪些网站被降权怎么办
  • 基于协同过滤算法的话剧购票系统(论文+源码)
  • 正规网站建设哪家好安徽省水利建设厅官方网站
  • zencart外贸建站网站建设联
  • 用 Python 实现连续数据分组求和并回写
  • 从0学Java--day7