社区讨论

链式前向星跟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 条回复,欢迎继续交流。

正在加载回复...