之前只学了个强连通Tarjan算法,然后又摸了缩点操作;

然后今天在lightoj摸了一道模板题,是求所有桥的题;

然后发现,要把:割点,割点集合,双连通,最小割边集合(桥),点连通分量,边连通分量都学一下。

--------------------

首先这个求割点是在无向图里面实现的(所以看到无向图有点感觉可以往这边考虑吧

先说割点,割点集合:

首先是割点这个问题啊,就是说在一个连通图里面,你删除某个点+这个点所连出去的边,图变成了不连通,就说这个点是割点,

然后呢我再说这句话就好理解了:在一个连通图中,如果有一个点集,删除这个点集+集合中所有点相关联的边,图变成了不连通,就称这个点集为割点集合。

若在连通图上至少删去k个顶点才能破坏图的连通性,则称此图的点连通度为k。

然后说桥;

类似的,如果一个边集,删除这些边(注意是要求删去边集所有边以后)以后,原图连通性被破坏,就称这个点集为割边集合。

一个图的边连通度的定义为最小割边集合中的边数。

当且仅当这个图的边连通度是1,则割边集合的唯一元素被称为桥;

//以下摘自PKU的PDF和 bin神模板

求割点

看了别人的博客:对啊,首先就是暴力一点,根据定义,我遍历所有的点,判断一下图是不是不连通了。

因为暴力所以优化啊。

在深度优先遍历整个图的过程中形成一棵搜索树(思路和有向图求强连通分量类似 ):

第一种方法:

Dfn[u]定义和Tarjan算法一样,表示编号为i的节点在DFS过程中 的访问序号(也可以叫做开始时间)。

Low[u]定义为u或者u的子树中能够通过非父子边(父子边就是搜索树上的边),追溯到的最早的节点的DFS开始时间;

一个顶点u是割点,当且仅当满足(1)或(2)

(1)    是树根(其实这个根就一个,就是最先进去的点),且u有多于一个子树。

(2)    u不为树根,且存在(u,v)为树枝边(或称父子边,即u为v在搜索树中的父亲),使得dfn(u)<=low[v];

我斌模板理解:

const int N=1e4+10;
const int M=2e4+10; struct Edge{
int to;
int next;
};
Edge q[M*2];
int head[M*2],tol,n,m;
int dfn[N],low[N];
int ind,top;
bool flag[N],vis[N]; void init()
{
tol=0;
memset(head,-1,sizeof(head));
} void add(int u,int v)
{
q[tol].to=v;
q[tol].next=head[u];
head[u]=tol++;
} void Tarjan(int u,int pre)
{
int v;
int son=0;
low[u]=dfn[u]=ind++;
vis[u]=true;
for(int i=head[u];i!=-1;i=q[i].next)
{
v=q[i].to;
if(v==pre)
continue;
if(!dfn[v])
{
son++;
Tarjan(v,u);
low[u]=min(low[v],low[u]);
if(u!=pre&&low[v]>=dfn[u])//首先不是树根,且存在(u,v)为树枝边。
flag[u]=true;
}
else
low[u]=min(low[u],dfn[v]);
}
if(pre==u&&son>1)//是树根,且存在两棵子树
flag[u]=true;
} void qiugedian()
{
//各种初始化;
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(flag,0,sizeof(flag));
ind=1;
Tarjan(1,1); //我们随便设个1作为树根,图上任意点都行,无所谓;
int ans=0;
for(int i=1;i<=n;i++)
if(flag[i])
ans++;
}

下面还是草稿、下次更新桥。。。。

-------------------

第二种方法:

也可以先用Tajan()进行dfs算出所有点的low和dfn值,并记录dfs过程中每个点的父节点,然后再把所有点看一遍,看其low和dfn,以找出割点和桥。

找桥的时候,要注意看有没有重边。有重边,则不是桥。

const int MAXN = 10010;
const int MAXM = 100010;
struct Edge
{
int to,next;
bool cut; //是否为桥的标记
} edge[MAXM];
int head[MAXN],tot;
int Low[MAXN],DFN[MAXN],Stack[MAXN];
int Index,top;
bool Instack[MAXN];
bool cut[MAXN];
int add_block[MAXN];//删除一个点后增加的连通块
int bridge;
void addedge(int u,int v)
{
edge[tot].to = v;
edge[tot].next = head[u];
edge[tot].cut = false;
head[u] = tot++;
} void Tarjan(int u,int pre)
{
int v;
Low[u] = DFN[u] = ++Index;
Stack[top++] = u;
Instack[u] = true; //入栈标记
int son = 0; //对于节点u的
for(int i = head[u]; i != -1; i = edge[i].next)
{
v = edge[i].to;
if(v == pre) //如果是他的父亲节点
continue;
if(!DFN[v])
{
son++;
Tarjan(v,u);
if(Low[u] > Low[v])
Low[u] = Low[v];
//桥
//一条无向边(u,v)是桥,当且仅当(u,v)为树枝边,且满足DFN(u)<Low(v)。
if(Low[v] > DFN[u])
{
bridge++;
edge[i].cut = true;
edge[i^1].cut = true;
}
//割点
//一个顶点u是割点,当且仅当满足(1)或(2)
//(1) u为树根,且u有多于一个子树
//(2) u不为树根,且满足存在(u,v)为树枝边(或称父子边,即u为v在搜索树中的父亲),使得DFN(u)<=Low(v)
if(u != pre && Low[v] >= DFN[u])//不是树根
{
cut[u] = true;
add_block[u]++;
}
}
else if( Low[u] > DFN[v])
Low[u] = DFN[v];
}
//树根,分支数大于1
if(u == pre && son > 1) cut[u] = true;
if(u == pre)
add_block[u] = son - 1;
Instack[u] = false;
top--;
}

Tarjan找桥和割点与点连通分量与边连通分量【未成形】的更多相关文章

  1. Codeforces Gym 100338C Important Roads 最短路+Tarjan找桥

    原题链接:http://codeforces.com/gym/100338/attachments/download/2136/20062007-winter-petrozavodsk-camp-an ...

  2. Codeforces 160D Edges in MST tarjan找桥

    Edges in MST 在用克鲁斯卡尔求MST的时候, 每个权值的边分为一类, 然后将每类的图建出来, 那些桥就是必须有的, 不是桥就不是必须有. #include<bits/stdc++.h ...

  3. Tarjan求强连通分量、求桥和割点模板

    Tarjan 求强连通分量模板.参考博客 #include<stdio.h> #include<stack> #include<algorithm> using n ...

  4. [学习笔记] Tarjan算法求桥和割点

    在之前的博客中我们已经介绍了如何用Tarjan算法求有向图中的强连通分量,而今天我们要谈的Tarjan求桥.割点,也是和上篇有博客有类似之处的. 关于桥和割点: 桥:在一个有向图中,如果删去一条边,而 ...

  5. Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载)

    Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载) 转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2 ...

  6. [Tarjan系列] Tarjan算法求无向图的桥和割点

    RobertTarjan真的是一个传说级的大人物. 他发明的LCT,SplayTree这些数据结构真的给我带来了诸多便利,各种动态图论题都可以用LCT解决. 而且,Tarjan并不只发明了LCT,他对 ...

  7. Tarjan算法求解无向连通图的割点、割边、点双连通分量和边双连通分量的模板

    历时好几天,终于完工了! 支持无向图四种功能:1.割点的求解 2.割边的求解 3.点双连通分量的求解 4.边双连通分量的求解 全部支持重边!!!!全部支持重边!!!!全部支持重边!!!! 测试数据: ...

  8. Tarjan的缩点&&割点概述

    What is Tarjan? Tarjan,是一种用来解决图的联通性的一种有效途径,它的一般俗称叫做:缩点.我们首先来设想一下: 如果我们有一个图,其中A,B,C构成一个环,那么我们在某种条件下,如 ...

  9. hdu 4738 Caocao's Bridges (tarjan求桥)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 题目大意:给一些点,用一些边把这些点相连,每一条边上有一个权值.现在要你破坏任意一个边(要付出相 ...

随机推荐

  1. 一堂C++课玩转rpm包的制作

    常见的Linux发行版主要可以分为两类,类ReadHat系列和类Debian系列,这里我们是以其软件包的格式来划分的,这两类系统分别提供了自己的软件包管理系统和相应的工具.类RedHat系统中软件包的 ...

  2. 20181125 test

    1.对一些不确定性的东西,还是需要一些勇气进行尝试 2.多阅读blog上的大咖的文章肯定会有提高的

  3. 关于java的线程

    1 java的线程也是一个对象 所以,java线程对象也是由gc销毁的. 2 java线程对象等待被销毁的时机 当java线程执行完run()方法之后就在等待被销毁了,所以要一个线程对象不被销毁唯一的 ...

  4. Local Response Normalization 60 million parameters and 500,000 neurons

    CNN是工具,在图像识别中是发现图像中待识别对象的特征的工具,是剔除对识别结果无用信息的工具. ImageNet Classification with Deep Convolutional Neur ...

  5. AndroidSlideTest.java

    以下代码使用ApiDemos-debug.apk进行测试 package com.saucelabs.appium; import io.appium.java_client.AppiumDriver ...

  6. 函数----Function对象

    函数---Function对象 一 .  函数的书写 函数 : 就是将一些语句进行封装,然后通过调用的形式,执行这些语句. 函数的作用 : ● 将大量重复的语句写在函数里,以后需要这些语句的时候,可以 ...

  7. React Native 隐藏组件思路

    In your render function:{ this.state.showTheThing && <TextInput/>} Then just do: this. ...

  8. LightOJ1336 Sigma Function —— 质因子分解、约数和为偶数

    题目链接:https://vjudge.net/problem/LightOJ-1336 1336 - Sigma Function    PDF (English) Statistics Forum ...

  9. Codeforces Round #401 (Div. 2) D Cloud of Hashtags —— 字符串

    题目链接:http://codeforces.com/contest/777/problem/D 题解: 题意:给出n行字符串,对其进行字典序剪辑.我自己的想法是正向剪辑的,即先对第一第二个字符串进行 ...

  10. RobotFramework教程使用笔记——RIDE的相关知识及Resources创建关键字文件

    RIDE是robotframework的图形操作前端,我们在RIDE上进行测试用例设计和编写测试脚本,并执行自动化测试.下面来全面的认识下这个操作工具. 在右边编辑页面有三大模块,Edit,TextE ...