社区讨论
链式前向星跟vector的时间复杂度?
P3379【模板】最近公共祖先(LCA)参与者 7已保存回复 7
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 7 条
- 当前快照
- 1 份
- 快照标识符
- @mi7chs2m
- 此快照首次捕获于
- 2025/11/20 19:25 4 个月前
- 此快照最后确认于
- 2025/11/20 19:25 4 个月前
vector就T了
CPP#include <bits/stdc++.h>
using namespace std;
int read( ){
int x=0,y=1;
char c=getchar( );
while(c>'9'||c<'0'){if(c=='-')y=-1;c=getchar( );}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar( );}
return x*y;
}
vector<int> a[500001];
int n,m,v0,k=0,dep[1000001],f[1000001][20];
void dfs(int u,int v){
f[v][0]=u;
for(register int i=0;i<a[v].size( );i++){
if(a[v][i]!=u){
dep[a[v][i]]=dep[v]+1;
dfs(v,a[v][i]);
}
}
}
int lca(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
for(register int i=19;i>=0;i--) if(dep[x]>=dep[y]+(1<<i)) x=f[x][i];
if(x==y) return x;
for(register int i=19;i>=0;i--)
if(f[x][i]!=f[y][i]){
x=f[x][i];y=f[y][i];
}
return f[x][0];
}
int main( ){
n=read( );m=read( );v0=read( );
for(register int i=1;i<n;i++){
int x1,x2;
x1=read( );x2=read( );
a[x1].push_back(x2);
a[x2].push_back(x1);
}
dfs(v0,v0);
for(register int i=1;i<=19;i++)
for(register int j=1;j<=n;j++)
if(f[j][i-1]) f[j][i]=f[f[j][i-1]][i-1];
for(register int i=1;i<=m;i++){
int x1,x2;
x1=read( );x2=read( );
printf("%d\n",lca(x1,x2));
}
return 0;
}
链式前向星就A了
CPP#include <bits/stdc++.h>
using namespace std;
int read( ){
int x=0,y=1;
char c=getchar( );
while(c>'9'||c<'0'){if(c=='-')y=-1;c=getchar( );}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar( );}
return x*y;
}
int n,m,v0,x1,x2,k=0,dep[1000001],f[1000001][20];
struct edge{
int u,v,next,head;
}e[1000001];
void add(int u,int v){
k++;
e[k].u=u;
e[k].v=v;
e[k].next=e[u].head;
e[u].head=k;
}
void dfs(int u,int v){
f[v][0]=u;
for(register int i=e[v].head;i!=0;i=e[i].next)
if(e[i].v!=u){
dep[e[i].v]=dep[v]+1;
dfs(v,e[i].v);
}
}
int lca(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
for(register int i=19;i>=0;i--) if(dep[x]>=dep[y]+(1<<i)) x=f[x][i];
if(x==y) return x;
for(register int i=19;i>=0;i--)
if(f[x][i]!=f[y][i]){
x=f[x][i];y=f[y][i];
}
return f[x][0];
}
int main( ){
n=read( );m=read( );v0=read( );
for(register int i=1;i<n;i++){
x1=read( );x2=read( );
add(x1,x2);add(x2,x1);
}
dfs(v0,v0);
for(register int i=1;i<=19;i++)
for(register int j=1;j<=n;j++)
if(f[j][i-1]) f[j][i]=f[f[j][i-1]][i-1];
for(register int i=1;i<=m;i++){
x1=read( );x2=read( );
printf("%d\n",lca(x1,x2));
}
return 0;
}
不应该是空间上的差异吗?时间为什么有,为什么我认为应该快一些,是调用vector耗时吗?
回复
共 7 条回复,欢迎继续交流。
正在加载回复...