无向图的连通性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; } }

浙公网安备 33010602011771号