首先给大家一个网址讲的比较细:http://www.cnblogs.com/en-heng/p/4002658.html

如果还有不懂的话,可以回来再看看我的文章;

概念明确:

  • 树边:(在[2]中称为父子边),在搜索树中的实线所示,可理解为在DFS过程中访问未访问节点时所经过的边。
  • 回边:(在[2]中称为返祖边后向边),在搜索树中的虚线所示,可理解为在DFS过程中遇到已访问节点时所经过的边

    low[u]记录节点u或u的子树通过非父子边追溯到最早的祖先节点

    用那个网址的例子,我给大家推演一下tarjan的dfn和low;

    A的dfn和low均为1;

    B:low = 1(通过B->A的回边)

    C: low = 1(通过C->A的回边)

    D:low = (B的dfn)5,(通过D->B的回边)

    E:low = 5,(通过E->B的回边)

    F:low = 1(通过F->A的回边)

    G:low = 5(通过G->B的回边)

    H:low = 5(通过H->B的回边)

    例题可以参考cojs921

    http://cojs.tk/cogs/problem/problem.php?pid=921

    代码如下

    #include<cstdio>
    const int maxn = 5010 ;
    using namespace std;
    inline void read(int &x){
    x=0;char ch;
    while(ch=getchar(),ch<'!');
    while(x=10*x+ch-'0',ch=getchar(),ch>'!');
    }
    inline int cat_max(const int &a,const int &b){return a>b ? a:b;}
    inline int cat_min(const int &a,const int &b){return a<b ? a:b;}
    struct Edge{
    int to,next;
    }G[100100];
    int tot,head[maxn],scc_cnt,dfs_cnt;
    int dfn[maxn],low[maxn],sccno[maxn];
    int sta[maxn],top,num[maxn];
    void add(int u,int v){
    G[++tot].to=v;
    G[tot].next=head[u];
    head[u]=tot;
    }
    void tarjan(int u){
    low[u]=dfn[u]=++dfs_cnt;
    sta[++top]=u;
    for(int i=head[u];i;i=G[i].next){
    int to=G[i].to;
    if(!dfn[to]){
    tarjan(to);
    low[u]=cat_min(low[u],low[to]);
    }
    else if(!sccno[to]) low[u]=cat_min(low[u],dfn[to]);
    }
    if(low[u]==dfn[u]){
    scc_cnt++;
    while(1){
    int x=sta[top--];
    sccno[x]=scc_cnt;
    num[scc_cnt]++;
    if(x==u) break;
    }
    }
    }
    int main(){
    freopen("classroom.in","r",stdin);
    freopen("classroom.out","w",stdout);
    int n;read(n);
    int m;read(m);
    int x,y,op;
    for(int i=1;i<=m;i++){
    read(x),read(y),read(op);
    add(x,y);
    if(op==2) add(y,x);
    }
    for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
    int max1=0,pos=0;
    for(int i=1;i<=scc_cnt;i++){
    if(num[i]>max1){
    max1=num[i];
    pos=i;
    }
    }
    printf("%d\n",max1);
    for(int i=1;i<=n;i++){
    if(sccno[i]==pos){
    printf("%d ",i);
    }
    }
    fclose(stdin);fclose(stdout);
    return 0;
    }

  • tarjan求割点的更多相关文章

    1. UESTC 900 方老师炸弹 --Tarjan求割点及删点后连通分量数

      Tarjan算法. 1.若u为根,且度大于1,则为割点 2.若u不为根,如果low[v]>=dfn[u],则u为割点(出现重边时可能导致等号,要判重边) 3.若low[v]>dfn[u], ...

    2. POJ 1144 Network(Tarjan求割点)

      Network Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12707   Accepted: 5835 Descript ...

    3. poj 1523 SPF(tarjan求割点)

      本文出自   http://blog.csdn.net/shuangde800 ------------------------------------------------------------ ...

    4. poj_1144Network(tarjan求割点)

      poj_1144Network(tarjan求割点) 标签: tarjan 割点割边模板 题目链接 Network Time Limit: 1000MS Memory Limit: 10000K To ...

    5. 洛谷P3388 【模板】割点(割顶)(tarjan求割点)

      题目背景 割点 题目描述 给出一个n个点,m条边的无向图,求图的割点. 输入输出格式 输入格式: 第一行输入n,m 下面m行每行输入x,y表示x到y有一条边 输出格式: 第一行输出割点个数 第二行按照 ...

    6. [POJ1144][BZOJ2730]tarjan求割点

      求割点 一种显然的n^2做法: 枚举每个点,去掉该点连出的边,然后判断整个图是否联通 用tarjan求割点: 分情况讨论 如果是root的话,其为割点当且仅当下方有两棵及以上的子树 其他情况 设当前节 ...

    7. poj1144 tarjan求割点

      poj1144 tarjan求割点 额,算法没什么好说的,只是这道题的读入非常恶心. 注意,当前点x是否是割点,与low[x]无关,只和low[son]和dfn[x]有关. 还有,默代码的时候记住分目 ...

    8. tarjan求割点割边的思考

      这个文章的思路是按照这里来的.这里讨论的都是无向图.应该有向图也差不多. 1.如何求割点 首先来看求割点.割点必须满足去掉其以后,图被分割.tarjan算法考虑了两个: 根节点如果有两颗及以上子树,它 ...

    9. Tarjan求割点和桥

      by szTom 前置知识 邻接表存储及遍历图 tarjan求强连通分量 割点 割点的定义 在一个无向图中,如果有一个顶点集合,删除这个顶点集合以及这个集合中所有顶点相关联的边以后,图的连通分量增多, ...

    10. tarjan求割点与割边

      tarjan求割点与割边 洛谷P3388 [模板]割点(割顶) 割点 解题思路: 求割点和割点数量模版,对于(u,v)如果low[v]>=dfn[u]那么u为割点,特判根结点,若根结点子树有超过 ...

    随机推荐

    1. Java获取字符串的CRC8校验码(由C程序的代码修改为了Java代码)

      CRC8算法请百度,我也不懂,这里只是把自己运行成功的结构贴出来了.方法CRC8_Tab这里没有处理,因为我的程序中没有用到. package com.crc; public class CCRC8_ ...

    2. Discrete Function(简单数学题)

      Discrete Function There is a discrete function. It is specified for integer arguments from 1 to N (2 ...

    3. php自定义函数: 遍历文件夹及其子文件夹

      function traverse_folder($path = '.') { $current_dir = opendir($path); while(($file = readdir($curre ...

    4. ros下单目相机校正

      1. 安装对应的驱动与程序包. 图像对应包   http://wiki.ros.org/camera_calibration          在gitbub下载image_pipeline :    ...

    5. Spring笔记:IOC基础

      Spring笔记:IOC基础 引入IOC 在Java基础中,我们往往使用常见关键字来完成服务对象的创建.举个例子我们有很多U盘,有金士顿的(KingstonUSBDisk)的.闪迪的(SanUSBDi ...

    6. Android:日常学习笔记(10)———使用LitePal操作数据库

      Android:日常学习笔记(10)———使用LitePal操作数据库 引入LitePal 什么是LitePal LitePal是一款开源的Android数据库框架,采用了对象关系映射(ORM)的模式 ...

    7. css 行内元素 块元素 替换元素 非替换元素 以及这些元素的width height margin padding 特性

      一.各种元素的width height margin padding 特性(具体css元素的分来参看二) 1.块级元素 width. height. margin的四个方向. padding的四个方向 ...

    8. How MapReduce Works(转)

      原文地址:http://www.cnblogs.com/ggjucheng/archive/2012/04/23/2465820.html 一.从Map到Reduce MapReduce其实是分治算法 ...

    9. unigui中TUniDBEdit的OnEndDrag问题

      非常奇怪,unigui中TUniDBEdit未发布OnEndDrag属性,包括其子类:TUniDBNumberEdit.TUniDBFormattedNumberEdit.而其他数据感知组件都有OnE ...

    10. 百度编辑器 Ueditor 如何增加字体 ?

      在百度编辑器 Ueditor 如何增加字体 ? 要修改两个文件: 第一个文件:editor-config.js: ,'fontfamily':[             { label:'',name ...