*无向图求桥+边双连通分量——Tarjan

来源:互联网 发布:关口知宏 杭州 编辑:程序博客网 时间:2024/06/06 01:45
今天是2017/6/1,DCDCBigBig的第十八篇博文

#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;struct edge{    int u,v,next;}a[100001];int n,m,u,v,tot=0,tim=0,head[100001],dfn[100001],low[100001],ansu[100001],ansv[100001];void add(int u,int v){    a[++tot].u=u;    a[tot].v=v;    a[tot].next=head[u];    head[u]=tot;}void tarjan(int u,int fa){    int v;    dfn[u]=low[u]=++tim;    for(int tmp=head[u];tmp!=-1;tmp=a[tmp].next){        v=a[tmp].v;        if(dfn[v]==0){            tarjan(v,u);            low[u]=min(low[u],low[v]);            if(low[v]>dfn[u]){                ansu[++ansu[0]]=u;                ansv[++ansv[0]]=v;            }        }else{            if(dfn[v]<dfn[u]&&v!=fa){                low[u]=min(low[u],dfn[v]);            }        }    }}int main(){    memset(head,-1,sizeof(head));    memset(dfn,0,sizeof(dfn));    memset(low,0,sizeof(low));    ansu[0]=0;    ansv[0]=0;    scanf("%d%d",&n,&m);    for(int i=1;i<=m;i++){        scanf("%d%d",&u,&v);        add(u,v);        add(v,u);    }    tarjan(1,-1);    printf("--------\n");    for(int i=1;i<=ansv[0];i++){        printf("%d %d\n",ansu[i],ansv[i]);    }    return 0;}/*6 71 22 31 33 44 55 66 4--------3 4*/

原创粉丝点击