• 9.23/9.26强连通分量学习笔记


    9.23

    Popular cows

    题目大意:

    有n只牛,牛A认为牛B很牛,牛B认为牛C很牛。给你M个关系(谁认为谁牛),求大家都认为它很牛的牛有几只。PS:如果牛A认为牛B很牛,牛B认为牛C很牛。那么我们就认为牛A认为牛C很牛。


    学习目标:

    强连通分量分解(或称缩点)的Kosaraju算法


    算法解释:

    强连通分量分解 对于一个有向图顶点的子集S,如果在S内任取两个顶点u和v,都能找到一条从u到v的路径,那么就称S是强连通的。如果在强连通的顶点集合S中加入其他任意顶点集合后,它都不再是强连通的,那么就称S是原图的一个强连通分量SCC(StronglyConnectedComponent)。任意有向图都可以分解成若干个不相交的强连通分量,这就是强连通分量的分解。把分解后的强连通分量缩成一个顶点,就得到一个DAG(有向无环图)。


    Kosaraju算法:

    强连通分量分解可以通过两次简单的DFS实现。第一次DFS时,选取任意顶点作为起点,遍历所有尚未访问过的顶点,并在回溯前给顶点标号(后序遍历)。对剩余的未访问过的顶点,不断重复上述过程。完成标号后,越接近图的尾部(深度优先搜索树的叶子),顶点的标号越小。第二次DFS时,先将所有边反向,然后以标号最大的顶点为起点进行 DFS。这样DFS所遍历的顶点集合就构成了一个强连通分量。之后,只要还有尚未访问的顶点,就从中选取标号最大的顶点不断重复上述过程。


    题解:

    用强连通分量分解,找出其中出度为0的顶点即为红人。

    这些代码是本人千辛万苦写出来的,借鉴即可,请勿抄袭,故用图片,请原谅。

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    压缩感知(CS)
    在linux服务器上配置anaconda和Tensorflow,并运行
    opencv基本操作
    在windows10下vs2017配置opencv4.0.0
    枚举
    图片居中
    css初始化
    常用颜色
    css三大布局
    盒子宽度
  • 原文地址:https://www.cnblogs.com/wuhu-xiaoshen/p/4918648.html
Copyright © 2020-2023  润新知