图连通性【tarjan点双连通分量、边双联通分量】【无向图】
根据 李煜东大牛:图连通性若干拓展问题探讨 ppt学习。
有割点不一定有割边,有割边不一定有割点。



理解low[u]的定义很重要。
1.无向图求割点、点双联通分量:
如果对一条边(x,y),如果low[y]>=dfn[x],表示搜索树中y为根的子树必须要通过x才能到达树的上端,则x必为割点。
x属于多个点双联通分量,所以出栈的时候保留x(所以栈出到y就好!否则可能会把其他支路的节点一起出栈)。
附上一个小例子。

这个打个模板吧。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std; const int N=;
int n,m,al,cnt,num,sl,dfn[N],low[N],vis[N],s[N],first[N],b[N][];
struct node{int x,y,next;}a[N*]; void ins(int x,int y)
{
a[++al].x=x;a[++al].y=y;
a[al].next=first[x];first[x]=al;
} int minn(int x,int y){return x<y ? x:y;} void tarjan(int x)
{
dfn[x]=low[x]=++num;
s[++sl]=x;
for(int i=first[x];i;i=a[i].next)
{
int y=a[i].y;
if(!dfn[y])
{
tarjan(y);
low[x]=minn(low[x],low[y]);
if(low[y]>=dfn[x])//key
{
cnt++;
b[cnt][++b[cnt][]]=x;
while()
{
int z=s[sl--];
b[cnt][++b[cnt][]]=z;
if(z==y) break;
}
}
}
else low[x]=minn(low[x],low[y]);
}
} int main()
{
freopen("a.in","r",stdin);
scanf("%d%d",&n,&m);
al=;
memset(first,,sizeof(first));
num=;cnt=;sl=;
memset(dfn,,sizeof(dfn));
memset(vis,,sizeof(vis));
memset(b,,sizeof(b));
for(int i=;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
ins(x,y);ins(y,x);
}
for(int i=;i<=n;i++)
if(!dfn[i]) tarjan(i);
for(int i=;i<=cnt;i++)
{
for(int j=;j<=b[i][];j++)
printf("%d ",b[i][j]);
printf("\n");
}
return ;
}
2.无向图求割边、边双联通分量:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std; const int N=;
int n,m,al,cnt,num,sl,dfn[N],low[N],vis[N],s[N],first[N],b[N][];
struct node{int x,y,next,tmp;}a[N*]; void ins(int x,int y)
{
a[++al].x=x;a[al].y=y;a[al].tmp=;
a[al].next=first[x];first[x]=al;
} int minn(int x,int y){return x<y ? x:y;} void tarjan(int x)
{
dfn[x]=low[x]=++num;
s[++sl]=x;
for(int i=first[x];i;i=a[i].next)
{
if(a[i].tmp) continue;
a[i].tmp=;
a[(i%)== ? i-:i+].tmp=;//key
int y=a[i].y;
if(!dfn[y])
{
tarjan(y);
low[x]=minn(low[x],low[y]);
if(low[y]>dfn[x])//key
{
cnt++;
while()
{
int z=s[sl--];
b[cnt][++b[cnt][]]=z;
if(z==y) break;
}
}
}
else low[x]=minn(low[x],low[y]);//前提:x->y不是搜索树上的边,故前面应该把走过的边的反向边去掉。
}
} int main()
{
//freopen("a.in","r",stdin);
scanf("%d%d",&n,&m);
al=;
memset(first,,sizeof(first));
num=;cnt=;sl=;
memset(dfn,,sizeof(dfn));
memset(vis,,sizeof(vis));
memset(b,,sizeof(b));
for(int i=;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
ins(x,y);ins(y,x);
}
for(int i=;i<=n;i++)
{
if(!dfn[i])
{
tarjan(i);
if(sl) //key
{
cnt++;
b[cnt][]=sl;
for(int j=;j<=sl;j++) b[cnt][j]=s[j];
sl=;
}
}
}
for(int i=;i<=cnt;i++)
{
for(int j=;j<=b[i][];j++)
printf("%d ",b[i][j]);
printf("\n");
}
return ;
}
图连通性【tarjan点双连通分量、边双联通分量】【无向图】的更多相关文章
- 双连通分量(点-双连通分量&边-双连通分量)
概念: 双连通分量有点双连通分量和边双连通分量两种.若一个无向图中的去掉任意一个节点(一条边)都不会改变此图的连通性,即不存在割点(桥),则称作点(边)双连通图. 一个无向图中的每一个极大点(边)双连 ...
- [HIHO1184]连通性二·边的双连通分量(双连通分量)
题目链接:http://hihocoder.com/problemset/problem/1184 题意裸,写个博客记下输出姿势. /* ━━━━━┒ギリギリ♂ eye! ┓┏┓┏┓┃キリキリ♂ mi ...
- 图->连通性->关节点和重连通分量
文字描述 相关定义:假若在删去顶点v以及和v相关联的各边之后,将图的一个连通分量分割成两个或两个以上的连通分量,则称顶点v为该图的一个关节点.一个没有关节点的连通图称为重连通图. 在重连通图上,任意一 ...
- tarjan算法与无向图的连通性(割点,桥,双连通分量,缩点)
基本概念 给定无向连通图G = (V, E)割点:对于x∈V,从图中删去节点x以及所有与x关联的边之后,G分裂为两个或两个以上不相连的子图,则称x为割点割边(桥)若对于e∈E,从图中删去边e之后,G分 ...
- Tarjan算法初探(3):求割点与桥以及双连通分量
接上一节Tarjan算法初探(2):缩点 在此首先提出几个概念: 割点集合:一个无向连通图G 若删除它的一个点集 以及点集中所有点相连的边(任意一端在点集中)后 G中有点之间不再连通则称这个点集是它的 ...
- [Tarjan系列] Tarjan算法求无向图的双连通分量
这篇介绍如何用Tarjan算法求Double Connected Component,即双连通分量. 双联通分量包括点双连通分量v-DCC和边连通分量e-DCC. 若一张无向连通图不存在割点,则称它为 ...
- HDU 3686 Traffic Real Time Query System(双连通分量缩点+LCA)(2010 Asia Hangzhou Regional Contest)
Problem Description City C is really a nightmare of all drivers for its traffic jams. To solve the t ...
- poj 3177 Redundant Paths(边双连通分量+缩点)
链接:http://poj.org/problem?id=3177 题意:有n个牧场,Bessie 要从一个牧场到另一个牧场,要求至少要有2条独立的路可以走.现已有m条路,求至少要新建多少条路,使得任 ...
- 无向图的边双连通分量(EBC)
嗯,首先边双连通分量(双连通分量之一)是:在一个无向图中,去掉任意的一条边都不会改变此图的连通性,即不存在桥(连通两个边双连通分量的边),称作边双连通分量.一个无向图的每一个极大边双连通子图称作此无向 ...
- DFS的运用(二分图判定、无向图的割顶和桥,双连通分量,有向图的强连通分量)
一.dfs框架: vector<int>G[maxn]; //存图 int vis[maxn]; //节点访问标记 void dfs(int u) { vis[u] = ; PREVISI ...
随机推荐
- block知识总结
一.block在内存中存在的形式 1.当把block句法写在函数或者方法外面时,系统会在静态数据区分配一块内存区域给block对象.这片区域在程序执行期会一直存在. 2.当block句法写在函数或者方 ...
- 【week3】psp (技术随笔)
本周psp: 随笔字数: 总计 累计代码行 (前两项为单元测试部分) 词频统计:87 四则运算:49 四人小组:39 175 随笔字数 (不包含代码字数) 词频统计:237 四则运算:125 四人小组 ...
- 相机上的P,S,A,M分别是什么单词的缩写?
程序曝光 Programmed Auto快门优先 Shutter Priority光圈优先 aperture-priority 全手动模式 Manual Mode
- php中的<?= ?>替换<?php echo ?>
首先修改PHP.ini文件.如下: 1. 将short_open_tag = Off 改成On 开启以后可以使用PHP的短标签:<? ?> <?= $test ?>来代替 &l ...
- java中多种方式读文件
转自:http://www.jb51.net/article/16396.htm java中多种方式读文件 一.多种方式读文件内容. 1.按字节读取文件内容 2.按字符读取文件内容 3.按行读取文件内 ...
- nginx 反向代理 ,入门
入门:http://www.cnblogs.com/jjzd/p/6691500.html 启动,重新加载:http://blog.csdn.net/zhongguozhichuang/article ...
- iOS开发简单介绍
概览 终于到了真正接触IOS应用程序的时刻了,之前我们花了很多时间去讨论C语言.ObjC等知识,对于很多朋友而言开发IOS第一天就想直接看到成果,看到可以运行的iOS程序.但是这里我想强调一下,前面的 ...
- [Leetcode] maximun subarray 最大子数组
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- 删边(cip)
删边(cip) 给出一个没有重边和自环的无向图,现在要求删除其中两条边,使得图仍然保持连通. 你的任务是计算有多少组不合法的选边方案.注意方案是无序二元组. Sol 神题,无从下手啊. 考虑点dfs建 ...
- Codeforces Round #169 (Div. 2) A水 B C区间更新 D 思路
A. Lunch Rush time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...