无向图的连通性bz(ez)

时间戳dfn,追溯值low。

1、找一个图的所有桥

void tarjan(int x,int in_edge)
{
    dfn[x] = low[x] = ++num;
    for(int i = head[x];i;i = nextt[i]){
        int y = ver[i];
        if(!dfn[y]){
            tarjan(y,i);
            low[x] = min(low[x],low[y]);
            if(low[y] > dfn[x]){
                bridge[i] = bridge[i^1] = 1;
            } 
        }
        else if(i != (in_edge ^ 1)) low[x] = min(low[x],dfn[y]);
    }
}
//以下在main里
tot = 1;
for(int i = 0;i <= n-1;++i){
    if(!dfn[i]) tarjan(i,-1);
} 
for(int i = 2;i < tot; i = i+2){
    if(bridge[i]){
        printf("%d %d\n",ver[i^1],ver[i] );
    }
}     

 

2、找所有的割点

void tarjan(int x)
{
    dfn[x] = low[x] = ++num;
    int flag = 0;
    for(int i = head[x] ;i ; i = nextt[i]){
        int y = ver[i];
        if(!dfn[y]){
            tarjan(y);
            low[x] = min(low[x],low[y]);
            if(low[y] >= dfn[x]){
                flag++;
                if(x != root || flag > 1) cut[x] = 1;
            }
        }
        else low[x] = min(low[x],dfn[y]);
    }
}
//main
for(int i=1;i<=n;i++){
    if(!dfn[i]){
        root = i;
        tarjan(i);
    }    
}
for(int i = 1;i <= n;++i){
    if(cut[i]){
        cout<<i<<endl;
    }
}

 

posted @ 2020-08-21 20:19  阿斯水生产线  阅读(156)  评论(0)    收藏  举报