支配树求查错
查看原帖
支配树求查错
483966
一粒夸克楼主2021/7/11 09:48

67分

#6、#16~#25 WA

#include<bits/stdc++.h>
using namespace std;
int n,m;
int ver[300005],ne[300005],head[300005],cnt;
inline void link(int x,int y){
    ver[++cnt]=y;
    ne[cnt]=head[x];
    head[x]=cnt;
}
int dep[300005];
int fa[20][300005];
inline int lca(int x,int y){
    if(dep[x]<dep[y])swap(x,y);
    for(int i=19;~i;i--)if(dep[fa[i][x]]>=dep[y]){
//      printf(" %d %d %d %d\n",x,y,dep[x],dep[y]);
        x=fa[i][x];
    }
    for(int i=19;~i;i--){
        if(fa[i][x]!=fa[i][y]){
//          printf(" %d %d\n",x,y);
            x=fa[i][x];
            y=fa[i][y];
        }
    }
    return x==y?x:fa[0][x];
}
int stk[300005],top;
bool vis[300005];
void dfs(int x){
    vis[x]=1;
    for(int i=head[x];i;i=ne[i]){
        int u=ver[i];
        if(!vis[u])dfs(u);
    }
    stk[++top]=x;
}
inline void build(){
    for(int i=0;i<20;i++)fa[i][1]=1;
    while(top){
        int x=stk[top];top--;
//      printf("%d:\n",x);
        for(int i=head[x];i;i=ne[i]){
            int u=ver[i];
            if(!fa[0][u])fa[0][u]=x;
            else fa[0][u]=lca(x,fa[0][u]);
            dep[u]=dep[fa[0][u]]+1;
            for(int i=1;i<20;i++)fa[i][u]=fa[i-1][fa[i-1][u]];
//          printf("%d %d %d\n",u,fa[0][u],dep[u]);
        }
    }
}
int siz[300005];
void dfs2(int x){
    siz[x]=1;
    for(int i=head[x];i;i=ne[i]){
        int u=ver[i];
        dfs2(u);
        siz[x]+=siz[u];
    }
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=0;i<m;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        if(y!=1)link(x,y);
    }
    dfs(1);
    build();
    memset(head,0,sizeof(head));
    cnt=0;
    for(int i=2;i<=n;i++)link(fa[0][i],i);
    dfs2(1);
    for(int i=1;i<=n;i++)printf("%d ",siz[i]);

    return 0;
}
2021/7/11 09:48
加载中...