[模板]一些tarjan

发现自己菜的一匹,于是发奋图强开始填坑(

可以参考老姚博客 这里

1. tarjan板子

void tarjan(int u){
    ipt[u]=low[u]=++cnt;
    s.push(u),instk[u]=true;
    for(int i=head[u];i;i=edge[i].pre){
        int v=edge[i].to;
        if(!ipt[v]){
            tarjan(v);
            low[u]=min(low[u],low[v]);
        }else if(instk[v]){
            low[u]=min(low[u],ipt[v]);
        }
    }
    if(ipt[u]==low[u]){
        point++;
        int v;
        do{
            v=s.top(),s.pop();
            instk[v]=false;
            sze[point]++;
            id[v]=point;
        }while(u!=v);
    }
}

 

2. 求割点

void tarjan(int root,int u){
    int son=0;
    ipt[u]=++tot;low[u]=tot;
    s.push(u);instk[u]=true;
    for(int i=head[u];i;i=edge[i].pre){
        int v=edge[i].to;
        if(!ipt[v]){
            tarjan(u,v);
            low[u]=min(low[u],low[v]);
            if(((!root)&&(++son>1))||((root)&&low[v]>=ipt[u])){
                cutpt[u]=1;
            }//求割点 
        }else if(instk[v]){
            low[u]=min(low[u],ipt[v]);
        }
    }
}

 

 3. 求割边

void tarjan(int u){
    //printf("Now is visiting node %d\n",u);
    ipt[u]=++tot,low[u]=tot;
    for(int i=head[u];i;i=edge[i].pre){
        int v=edge[i].to;
        if(!ipt[v]){
            fa_edge[v]=edge[i].id;
            tarjan(v);
            low[u]=min(low[u],low[v]);
        }else if(fa_edge[u]!=edge[i].id){
            low[u]=min(low[u],ipt[v]);
        }
    }
    if(low[u]==ipt[u]&&fa_edge[u]){
        cutedge[fa_edge[u]]=true;
    }
}

 

posted @ 2022-07-09 09:09  冬天的雨WR  阅读(34)  评论(0)    收藏  举报
Live2D