zoukankan      html  css  js  c++  java
  • 双连通分量和强连通分量的总结

    【双连通分量】

    一、边双连通分量定义

    在分量内的任意两个点总可以找到两条边不相同的路径互相到达。总而言之就是一个圈,正着走反着走都可以相互到达,至少只有一个点。

    二、点双连通分量的定义

    参照上面,唯一的不同:任意两个点可以找到一个点不同的路径互相到达。也是一个圈,正反走都可以,至少为一个点。

    三、边、点双连通分量模板代码要注意的地方

    边双连通分量:

    1.每个节点的所有儿子遍历后才开始计算分量大小,请与点双连通相区分;

    2.割顶只能属于一个分量,请与割边区分;(容易搞混)

    3.要注意j是否是i的父节点;

    点双连通分量:

    1.每遍历一个儿子就计算是否有点连通分量;

    2.割顶可以属于多个连通分量,请注意与割边区分;

    3.当i为根节点时,至少要有两个儿子才能是割点;

    【强连通分量】

    一、定义

    有向图上的环,不啰嗦,与上面两种类似,至少为一个点;

    二、模板代码注意的地方

    1.每个点所有儿子遍历完才开始求分量;(类似边双连通分量)

    2.每个点只能属于一个分量;

    【强连通分量和双连通分量常见的模型和问法】

    双连通分量

    1.给出的图是非连通图,如:

    a.有一些点,一些边,加最少的边,要使得整个图变成双联通图。

    大致方法:求出所有分量,把每个分量看成一个点,统计每个点的度,有一个度为一则cnt加1,答案为(cnt+1)/2;

    b.有一些点,一些边,问最少多少个点单着。

    大致方法:求出所有的分量即可,但要注意不同的题可能有特殊要求(如圆桌骑士要求奇圈,要用到二分图判定)

    c.各种变式问题

    2.给出的图是连通图,如:

    a.给定一个起点一个终点,求各种问题是否能实现。

    大致方法:求出所有分量,并把每个分量当成点,于是问题得到化简;

    b.给一个图,然后有大量的离线回答。

    大致方法:求出所有分量,再求出上下子树的信息;

    c.各种变式问题;

    强连通分量

    1.给出的是非连通图,如:

    a.有一些点,一些有向边,求至少加多少边使任意两个点可相互到达

    大致方法:求出所有的分量,缩点,分别求出出度入度为0的点的数量,取多的为答案;

    b.有一些点,一些有向边,求在这个图上走一条路最多可以经过多少个点

    大致方法:求出所有的分量,缩点,形成一个或多个DAG图,然后做DAG上的dp

    c.有一些点,一些有向边,给出一些特殊点,求终点是特殊点的最长的一条路

    大致方法:求出所有分量,并标记哪些分量有特殊点,然后也是DAG的dp

    2.给出的是连通图,比较少,有也比较简单

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

    总结:

    1.遇到非连通图几乎可以肯定是要求连通分量,不论是无向还是有向图;(可以节约大量思考时间)

    2.凡是对边、点的操作,在同一个分量内任意一个点效果相同的,几乎都是缩点解决问题;再粗暴点,几乎求了连通分量都要缩点;

    3.一定要考虑特殊情况,如整个图是一个连通分量等(考虑到了就有10-20分);

    4.对于双连通分量要分析是边还是点双连通分量;通过题目来判断;

    5.拿到题目要先搞清楚给的是连通图还是非连通图。

  • 相关阅读:
    审核被拒:包含隐藏功能
    iOS好的个人博客和平台网站
    免费的Git和SVN服务器
    组件化
    三方生产利器
    RSA加密解密和签名验证机制以及其区别和联系
    APP和后台接口设计规范
    树和二叉树2——输出广义表形式(带括号)二叉树
    树和二叉树1——链式二叉树基础
    计算机图形学5——Two-Dimensional Viewing and Clipping(二维线段裁剪算法)
  • 原文地址:https://www.cnblogs.com/DWVictor/p/11348152.html
Copyright © 2011-2022 走看看