热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Tarjan找桥和割点与点连通分量与边连通分量【未成形】

之前只学了个强连通Tarjan算法,然后又摸了缩点操作;然后今天在lightoj摸了一道模板题,是求所有桥的题;然后发现&#

之前只学了个强连通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不为树根&#xff0c;且存在(u,v)为树枝边&#xff08;或称父子边&#xff0c;即u为v在搜索树中的父亲&#xff09;&#xff0c;使得dfn(u)<&#61;low[v];

我斌模板理解&#xff1a;

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

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

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


第二种方法&#xff1a;

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

找桥的时候&#xff0c;要注意看有没有重边。有重边&#xff0c;则不是桥。


const int MAXN &#61; 10010;
const int MAXM &#61; 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 &#61; v;edge[tot].next &#61; head[u];edge[tot].cut &#61; false;head[u] &#61; tot&#43;&#43;;
}void Tarjan(int u,int pre)
{int v;Low[u] &#61; DFN[u] &#61; &#43;&#43;Index;Stack[top&#43;&#43;] &#61; u;Instack[u] &#61; true; //入栈标记int son &#61; 0; //对于节点u的for(int i &#61; head[u]; i !&#61; -1; i &#61; edge[i].next){v &#61; edge[i].to;if(v &#61;&#61; pre) //如果是他的父亲节点continue;if(!DFN[v]){son&#43;&#43;;Tarjan(v,u);if(Low[u] > Low[v]) Low[u] &#61; Low[v];//桥//一条无向边(u,v)是桥&#xff0c;当且仅当(u,v)为树枝边&#xff0c;且满足DFN(u) DFN[u]){bridge&#43;&#43;;edge[i].cut &#61; true;edge[i^1].cut &#61; true;}//割点//一个顶点u是割点&#xff0c;当且仅当满足(1)或(2) //(1) u为树根&#xff0c;且u有多于一个子树//(2) u不为树根&#xff0c;且满足存在(u,v)为树枝边(或称父子边&#xff0c;即u为v在搜索树中的父亲)&#xff0c;使得DFN(u)<&#61;Low(v)if(u !&#61; pre && Low[v] >&#61; DFN[u])//不是树根{cut[u] &#61; true;add_block[u]&#43;&#43;;}}else if( Low[u] > DFN[v])Low[u] &#61; DFN[v];}//树根&#xff0c;分支数大于1if(u &#61;&#61; pre && son > 1) cut[u] &#61; true;if(u &#61;&#61; pre)add_block[u] &#61; son - 1;Instack[u] &#61; false;top--;
}



转:https://www.cnblogs.com/keyboarder-zsq/p/6216766.html



推荐阅读
  • 三角测量计算三维坐标的代码_双目三维重建——层次化重建思考
    双目三维重建——层次化重建思考FesianXu2020.7.22atANTFINANCIALintern前言本文是笔者阅读[1]第10章内容的笔记,本文从宏观的角度阐 ... [详细]
  • 短暂的人生中,IT和技术只是其中的一部分。无论换工作还是换行业,最终的目标是成功、荣誉和收获。本文探讨了技术人员如何跳出纯技术的局限,实现更大的职业发展。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • C#实现文件的压缩与解压
    2019独角兽企业重金招聘Python工程师标准一、准备工作1、下载ICSharpCode.SharpZipLib.dll文件2、项目中引用这个dll二、文件压缩与解压共用类 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 非计算机专业的朋友如何拿下多个Offer
    大家好,我是归辰。秋招结束后,我已顺利入职,并应公子龙的邀请,分享一些秋招面试的心得体会,希望能帮助到学弟学妹们,让他们在未来的面试中更加顺利。 ... [详细]
  • 本文介绍了如何在 Spring 3.0.5 中使用 JdbcTemplate 插入数据并获取 MySQL 表中的自增主键。 ... [详细]
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
    HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ... [详细]
  • 双指针法在链表问题中应用广泛,能够高效解决多种经典问题,如合并两个有序链表、合并多个有序链表、查找倒数第k个节点等。本文将详细介绍这些应用场景及其解决方案。 ... [详细]
  • 本文介绍了几种常用的图像相似度对比方法,包括直方图方法、图像模板匹配、PSNR峰值信噪比、SSIM结构相似性和感知哈希算法。每种方法都有其优缺点,适用于不同的应用场景。 ... [详细]
  • 结城浩(1963年7月出生),日本资深程序员和技术作家,居住在东京武藏野市。他开发了著名的YukiWiki软件,并在杂志上发表了大量程序入门文章和技术翻译作品。结城浩著有30多本关于编程和数学的书籍,其中许多被翻译成英文和韩文。 ... [详细]
  • 字符串学习时间:1.5W(“W”周,下同)知识点checkliststrlen()函数的返回值是什么类型的?字 ... [详细]
  • 最详尽的4K技术科普
    什么是4K?4K是一个分辨率的范畴,即40962160的像素分辨率,一般用于专业设备居多,目前家庭用的设备,如 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
author-avatar
年轻的周末我做主
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有