根据 李煜东大牛:图连通性若干拓展问题探讨 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点双连通分量、边双联通分量】【无向图】的更多相关文章

  1. 双连通分量(点-双连通分量&边-双连通分量)

    概念: 双连通分量有点双连通分量和边双连通分量两种.若一个无向图中的去掉任意一个节点(一条边)都不会改变此图的连通性,即不存在割点(桥),则称作点(边)双连通图. 一个无向图中的每一个极大点(边)双连 ...

  2. [HIHO1184]连通性二·边的双连通分量(双连通分量)

    题目链接:http://hihocoder.com/problemset/problem/1184 题意裸,写个博客记下输出姿势. /* ━━━━━┒ギリギリ♂ eye! ┓┏┓┏┓┃キリキリ♂ mi ...

  3. 图->连通性->关节点和重连通分量

    文字描述 相关定义:假若在删去顶点v以及和v相关联的各边之后,将图的一个连通分量分割成两个或两个以上的连通分量,则称顶点v为该图的一个关节点.一个没有关节点的连通图称为重连通图. 在重连通图上,任意一 ...

  4. tarjan算法与无向图的连通性(割点,桥,双连通分量,缩点)

    基本概念 给定无向连通图G = (V, E)割点:对于x∈V,从图中删去节点x以及所有与x关联的边之后,G分裂为两个或两个以上不相连的子图,则称x为割点割边(桥)若对于e∈E,从图中删去边e之后,G分 ...

  5. Tarjan算法初探(3):求割点与桥以及双连通分量

    接上一节Tarjan算法初探(2):缩点 在此首先提出几个概念: 割点集合:一个无向连通图G 若删除它的一个点集 以及点集中所有点相连的边(任意一端在点集中)后 G中有点之间不再连通则称这个点集是它的 ...

  6. [Tarjan系列] Tarjan算法求无向图的双连通分量

    这篇介绍如何用Tarjan算法求Double Connected Component,即双连通分量. 双联通分量包括点双连通分量v-DCC和边连通分量e-DCC. 若一张无向连通图不存在割点,则称它为 ...

  7. 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 ...

  8. poj 3177 Redundant Paths(边双连通分量+缩点)

    链接:http://poj.org/problem?id=3177 题意:有n个牧场,Bessie 要从一个牧场到另一个牧场,要求至少要有2条独立的路可以走.现已有m条路,求至少要新建多少条路,使得任 ...

  9. 无向图的边双连通分量(EBC)

    嗯,首先边双连通分量(双连通分量之一)是:在一个无向图中,去掉任意的一条边都不会改变此图的连通性,即不存在桥(连通两个边双连通分量的边),称作边双连通分量.一个无向图的每一个极大边双连通子图称作此无向 ...

  10. DFS的运用(二分图判定、无向图的割顶和桥,双连通分量,有向图的强连通分量)

    一.dfs框架: vector<int>G[maxn]; //存图 int vis[maxn]; //节点访问标记 void dfs(int u) { vis[u] = ; PREVISI ...

随机推荐

  1. Python 服务器端表单验证插件

    Python格式验证库 Cerberus 作者 MrStranger 关注 2016.08.02 14:44 字数 2140 阅读 79评论 0喜欢 1 Cerberus是一个验证Python对象.M ...

  2. 算法与数据结构实验题 6.4 Summary

    ★实验任务 可怜的 Bibi 丢了好几台手机以后,看谁都像是小偷,他已经在小本本上记 下了他认为的各个地点的小偷数量. 现在我们将 Bibi 的家附近的地形抽象成一棵有根树.每个地点都是树上的 一个节 ...

  3. OSG学习:多重纹理映射

    #include<osgViewer\Viewer> #include<osg\Node> #include<osg\Geode> #include<osg\ ...

  4. 【week3】四则运算 单元测试

    上一周的四则运算有bug,这次补充正确代码: // 中缀转后缀 public String[] SolveOrder(String[] in, HashMap<String, Integer&g ...

  5. git初始化之git config

    git初始化之git config     1. 下面的命令将修改/home/[username]/.gitconfig文件,也就是说下面的配置只对每一个ssh的用户可见,所以每个人都需要做.   提 ...

  6. PHP中如何使用Redis接管文件存储Session详解

    https://www.jb51.net/article/151580.htm 前言 php默认使用文件存储session,如果并发量大,效率会非常低.而redis对高并发的支持非常好,可以利用red ...

  7. c#控件的name和text属性有什么不同?

    text 是显示出来,供用户和自己编辑方便使用的,name 属性是编辑代码用的. 比如要读取一个text栏的内容 取name='txtName' text='姓名'代码段需要写的是, txtName. ...

  8. 【.Net】C# 反编译工具之dnSpy

    下载地址:https://github.com/0xd4d/dnSpy/releases无需安装,和 ILSPY同门,感觉比ILSPY还强大 直接把dll拖拽到程序集资源管理器里面就可以啦

  9. WC2017 划水记

    Day 0 (2.2) 一寒假没有好好写题....于是晚上打了人生第一场codeforces,写了Div2三道水题就弃疗了23333333 Day  1  (2.3) 从德州高铁站坐小火车G57去绍兴 ...

  10. MD5 十六进制加密

    MD5的加密方法很多,今天说下MD5的十六进制加密···先贴方法···· class Program { static void Main(string[] args) { //202cb962ac5 ...