首页 > 其他分享 >Tarjan 之 割点 学习笔记

Tarjan 之 割点 学习笔记

时间:2024-08-22 14:37:18浏览次数:8  
标签:Tarjan int 割点 笔记 dfn low nodes root

首先,要求割点,我们需要知道割点是什么

割点: 是指在无向连通图中,如果删除某个顶点后,图的连通分量增加,则称该顶点为割点

好,知道了这个,那我们怎么去求他呢?

Tarjan 大神给出了一种依然基于时间戳的算法

图片来源:董晓算法

image

image

割点的求法大概就是这样的
所以细节还是见代码吧

#include<bits/stdc++.h>
using namespace std;
int n,m;
struct node
{
    vector<int > to;
    int dfn;
    int low;
    bool cut;
};
node nodes[100000];
int tot;
int root;

void tarjan(int x)
{
    nodes[x].dfn=nodes[x].low=++tot;//标记DFN值
    int chi=0;//子节点
    int to;
    for(int ww=0;ww<nodes[x].to.size();ww++)
    {
        to=nodes[x].to[ww];
        if(nodes[to].dfn==0)//如果这个儿子节点还没被访问过
        {
            tarjan(to);//递归的跑Tarjan
            nodes[x].low=min(nodes[x].low,nodes[to].low);//更新本节点的low值
            if(nodes[to].low>=nodes[x].dfn)//如果子节点的low值比本节点的DFN大
            {
                chi++;
                if(x!=root||chi>1)
                {
                    nodes[x].cut=1;//是割点
                }
            }
        }
        else//如果没被访问过
        {
            nodes[x].low=min(nodes[x].low,nodes[to].dfn);//更新low值
        }
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>m;
    int a,b;
    for(int yy=1;yy<=m;yy++)
    {
        cin>>a>>b;
        nodes[a].to.push_back(b);
        nodes[b].to.push_back(a);
    }
    for(root=1;root<=n;root++)
    {
        if(!nodes[root].dfn)
        {
            tarjan(root);
        }
    }
    int ans=0;
    for(int ww=1;ww<=n;ww++)
    {
        ans+=nodes[ww].cut;
    }
    cout<<ans<<endl;

    for(int ww=1;ww<=n;ww++)
    {
        if(nodes[ww].cut)
        {
            cout<<ww<<" ";
        }
    }
    return 0;
}

标签:Tarjan,int,割点,笔记,dfn,low,nodes,root
From: https://www.cnblogs.com/sea-and-sky/p/18373812

相关文章

  • Java学习笔记3事务的四大特性
      ACID,分别是原子性、一致性、隔离性、持久性。①原子性(Atomiticy)原子性指事务包含的所有操作要么全部执行成功,要么全部失败回滚,因此事务的操作如果成功就必须要全部应用到数据库,如果操作失败则不能对数据库有任何影响。②一致性(Consistency)一致性是指事务必须使数据库从......
  • Java学习笔记2(数据库的三大范式)
    什么是范式?范式是数据库设计时遵循的一种规范,不同的规范要求遵循不同的范式。最常用的三大范式第一范式(1NF):属性不可分割,即每个属性都是不可分割的原子项。(实体的属性即表中的列)ps:举个例子,地址列山东省青岛市市北区,可以这样存储,但是实际上不满足第一范式,因为省市区是可以分......
  • python小白学习笔记(基于黑马程序员编写03)
    目录二十一、函数基础定义    1.解释:    2.为什么要用函数呢?    3.定义:二十二、函数参数    1.解释:    2.定义:二十三、函数返回值    1.解释:    2.定义:    思考:补充:None    1.解释 ......
  • 动态树笔记
    不知道“树链剖分”、“全局平衡二叉树”等应不应该归类到“动态树”里面...解决动态树问题的本质是将原树映射到一个高度为\(O(\logn)\)的树上。树链剖分主要是重链剖分,具体略.支持:链修改链查询子树修改子树查询这里的修改、查询需要满足可以用数据结构维护.一般......
  • GPT4SM论文阅读笔记
    AreGPTEmbeddingsUsefulforAdsandRecommendation?论文阅读笔记Abstract现存的问题:​ 尽管LLMs潜力巨大,但关于其文本嵌入是否能帮助广告和推荐服务的讨论却十分有限。提出方法:​ 为了探索GPT嵌入在广告和推荐中的应用,我们提出了三种策略,将LLMs的知识整合到基本P......
  • Linux系统运维笔记,openEuler-22.03 安装阿里(aliyun)yum
    Linux系统运维笔记,openEuler-22.03 安装阿里(aliyun)yum阿里巴巴开源镜像站点:http://mirrors.aliyun.com yum源理解yum源仓库的地址在/etc/yum.repos.d/,并且只能读出第一层的repo文件,yum仓库的文件都是以.repo结尾的。为加快yum下载,我们下载阿里云的.repo仓库文件,放到/e......
  • DP斜率优化学习笔记
    最后一次修改:2024.7.1614:39P.MBy哈哈铭简介“斜率优化”顾名思义就是用斜率进行优化,让\(DP\)的时间复杂度更优。一般情况下,将动态转移方程化简后得到这样的关系式:\[\frac{y_1-y_2}{x_1-x_2}\leqK\]然后通过该式进行转移,以达到优化时间复杂度的目的。小tip:推公式前......
  • 算法笔记|Day32动态规划V
    算法笔记|Day32动态规划V※※※※※完全背包问题理论基本题目描述题目分析采用一维数组(滚动数组)☆☆☆☆☆leetcode518.零钱兑换II题目分析代码☆☆☆☆☆leetcode377.组合总和Ⅳ题目分析代码☆☆☆☆☆KamaCoder57.爬楼梯(待补充)题目分析代码※※※※※完全......
  • Spark超全笔记 一站式搞定!!
    sparkSparkSpark和Hadoop的区别Spark计算流程Spark组成架构(spark的五大组件)Spark内核调度流程Spark并行度RDDRDD的五大特性RDD的创建RDD常用算子常用transformation算子常用action算子RDD缓存和checkpoint对比RDD依赖依赖管理DAG有向无环图为什么要进行stage划分Spar......
  • 【学习笔记】数学基础:Ferrers 图
    在分拆时我们有的时候很难搞,所以需要引入Ferrers图定义将分拆的每个部分用点组成的行表示,每行点的个数是这个部分的大小根据分拆的定义,Ferrers图中不同的行按照递减的顺序排放分拆:将自然数n写成递降正整数和的表示。\[n=r_1+r_2+\ldots+r_k\quadr_1\ger_2\ge\ldo......