根据 李煜东大牛:图连通性若干拓展问题探讨 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. Android框架 与 源码结构

    一. Android 框架 Android框架层级 : Android 自下 而 上 分为 4层; -- Linux内核层; -- 各种库 和 Android运行环境层; -- 应用框架层; -- 应 ...

  2. String 和 CharSequence 关系与区别

    String 继承于CharSequence,也就是说String也是CharSequence类型. CharSequence是一个接口,它只包括length(), charAt(int index) ...

  3. TCP系列14—重传—4、Karn算法和TSOPT的RTTM

    一.Karn算法 在RTT采样测量过程中,如果一个数据包初传后,RTO超时重传,接着收到这个数据包的ACK报文,那么这个ACK报文是对应初传TCP报文还是对应重传TCP报文呢?这个问题就是retran ...

  4. Ligerui首页的快速搭建

    一.目录 1.多层架构+MVC+EF+AUTOFAC+AUTOMAPPER: 2.MVC中验证码的实现(经常用,记录备用) 3.Ligerui首页的快速搭建 4.Ligerui Grid组件--学生信 ...

  5. WE团队团队汇总

    WE团队目录 一.博客汇总 团队展示 选题报告 二.文档汇总 选题报告

  6. Gitkraken系列-Gitkraken修改用户名

    修改用户名 为了方便项目中代码的管理,需要重新编辑用户名. 点击右上角的图像即可看到如下图 3‑1所示的下拉菜单,鼠标悬于Profile上,会出现一个Edit按钮. 图 3‑1 编辑个人信息 点击Ed ...

  7. js alert()后进行跳转的方法

    如果alert()之后再进行跳转本页,按以下方法你将等不到alert(),浏览器就本身刷新本页面了 <script type="text/javascript"> al ...

  8. UIKit中的几个核心对象的介绍:UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍

    UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍 一:UIApplication:单例(关于单例后面的文章中会详细介绍,你现在只要知道 ...

  9. Luogu2540 斗地主增强版(搜索+动态规划)

    单纯的暴搜似乎还是很好写的,然而过不了.出完顺子之后答案是可以dp出来的,于是大力搜然后大力dp就好了. dp时强行讨论完了几乎所有拆牌情况,理性愉悦一发. #include<iostream& ...

  10. hadoop 使用Avro求最大值

    在上例中:hadoop MapReduce辅助排序解析,为了求每年的最大数据使用了mapreduce辅助排序的方法. 本例中介绍利用Avro这个序列化框架的mapreduce功能来实现求取最大值.Av ...